CMakeLists.txt | 6 ++ config.h.cmake | 3 + configure.ac | 14 ++++ m4/libpng.m4 | 99 ++++++++++++++++++++++++++++++++++ utils/CMakeLists.txt | 4 + utils/HtmlOutputDev.cc | 141 +++++++++++++++++++++++++++++++++++++++++++++---- utils/HtmlOutputDev.h | 3 - utils/Makefile.am | 4 + 8 files changed, 262 insertions(+), 12 deletions(-)
New commits: commit af74fef03bfbd79334da5612c63c7793952542f9 Author: Warren Toomey <[email protected]> Date: Tue Jan 6 01:36:31 2009 +0100 Add forgotten file to let the autotools based system build diff --git a/m4/libpng.m4 b/m4/libpng.m4 new file mode 100644 index 0000000..2633c13 --- /dev/null +++ b/m4/libpng.m4 @@ -0,0 +1,99 @@ +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([FIND_PNG_HELPER], +[ +AC_MSG_CHECKING([for libpng]) +AC_CACHE_VAL(ac_cv_lib_png, +[ +ac_save_LIBS="$LIBS" +LIBS="$all_libraries $USER_LDFLAGS -lpng -lm" +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $all_includes $USER_INCLUDES" +AC_TRY_LINK( +[ +#ifdef __cplusplus +extern "C" { +#endif +void png_access_version_number(); +#ifdef __cplusplus +} +#endif +], +[png_access_version_number();], + eval "ac_cv_lib_png=-lpng", + eval "ac_cv_lib_png=no") +LIBS="$ac_save_LIBS" +CFLAGS="$ac_save_CFLAGS" +]) + +if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then + enable_libpng=yes + LIBPNG_LIBS="$ac_cv_lib_png" + AC_MSG_RESULT($ac_cv_lib_png) +else + AC_MSG_RESULT(no) + $1 +fi +]) + + +AC_DEFUN([POPPLER_FIND_PNG], +[ +dnl first look for libraries +FIND_PNG_HELPER( + FIND_PNG_HELPER(normal, [], + [ + LIBPNG_LIBS= + ] + ) +) + +dnl then search the headers (can't use simply AC_TRY_xxx, as png.h +dnl requires system dependent includes loaded before it) +png_incdirs="`eval echo $includedir` /usr/include /usr/local/include " +AC_FIND_FILE(png.h, $png_incdirs, png_incdir) +test "x$png_incdir" = xNO && png_incdir= + +dnl if headers _and_ libraries are missing, this is no error, and we +dnl continue with a warning (the user will get no png support) +dnl if only one is missing, it means a configuration error, but we still +dnl only warn +if test -n "$png_incdir" && test -n "$LIBPNG_LIBS" ; then + AC_DEFINE_UNQUOTED(ENABLE_LIBPNG, 1, [Define if you have libpng]) +else + if test -n "$png_incdir" || test -n "$LIBPNG_LIBS" ; then + AC_MSG_WARN([ +There is an installation error in png 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 libpng. You +can get a source package of libpng from http://www.libpng.org/pub/png/libpng.html +Disabling PNG support. +]) + else + AC_MSG_WARN([libpng not found. disable PNG support.]) + fi + png_incdir= + enable_libpng=no + LIBPNG_LIBS= +fi + +AC_SUBST(LIBPNG_LIBS) +]) commit ae588500f62bab5666174ff3b1564c414c5a76c5 Author: Albert Astals Cid <[email protected]> Date: Tue Jan 6 01:35:38 2009 +0100 Fix the cmake buildsystem diff --git a/CMakeLists.txt b/CMakeLists.txt index 45c77fe..c088bd3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,7 @@ macro_bool_to_01(ENABLE_SPLASH HAVE_SPLASH) find_package(Freetype REQUIRED) find_package(Fontconfig REQUIRED) macro_optional_find_package(JPEG) +macro_optional_find_package(PNG) if(JPEG_FOUND) set(ENABLE_LIBJPEG ${JPEG_FOUND}) endif(JPEG_FOUND) @@ -89,6 +90,10 @@ 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(ENABLE_ABIWORD) include_directories(${LIBXML2_INCLUDE_DIR}) add_definitions(${LIBXML2_DEFINITIONS}) @@ -426,6 +431,7 @@ show_end_message("qt4 wrapper" QT4_FOUND) show_end_message("glib wrapper" GLIB_FOUND) # message(" use gtk-doc: $enable_gtk_doc") # TODO show_end_message("use libjpeg" ENABLE_LIBJPEG) +show_end_message("use libpng" ENABLE_LIBPNG) show_end_message("use zlib" ENABLE_ZLIB) show_end_message("use libopenjpeg" LIBOPENJPEG_FOUND) show_end_message("command line utils" ENABLE_UTILS) diff --git a/config.h.cmake b/config.h.cmake index 1d34b54..b64185c 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -6,6 +6,9 @@ /* Use zlib instead of builtin zlib decoder. */ #cmakedefine ENABLE_ZLIB 1 +/* Use libpng to export images in pdftohtml. */ +#cmakedefine ENABLE_LIBPNG 1 + /* Use cairo for rendering. */ #cmakedefine HAVE_CAIRO 1 diff --git a/utils/CMakeLists.txt b/utils/CMakeLists.txt index f5d4911..233fdcb 100644 --- a/utils/CMakeLists.txt +++ b/utils/CMakeLists.txt @@ -69,7 +69,11 @@ set(pdftohtml_SOURCES ${common_srcs} HtmlOutputDev.cc ) add_executable(pdftohtml ${pdftohtml_SOURCES}) +if (ENABLE_LIBPNG) +target_link_libraries(pdftohtml ${common_libs} ${PNG_LIBRARIES}) +else (ENABLE_LIBPNG) target_link_libraries(pdftohtml ${common_libs}) +endif (ENABLE_LIBPNG) install(TARGETS pdftohtml DESTINATION bin) if (ENABLE_ABIWORD) commit 940d060a14712c09da427e2fac4ec579f7291b0f Author: Albert Astals Cid <[email protected]> Date: Tue Jan 6 01:27:06 2009 +0100 do not leak fName if fopen fails diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index 19dcf7e..bda3846 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -1204,6 +1204,7 @@ void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, ++imgNum; if (!(f1 = fopen(fName->getCString(), "wb"))) { error(-1, "Couldn't open image file '%s'", fName->getCString()); + delete fName; return; } @@ -1292,6 +1293,7 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, if (!(f1 = fopen(fName->getCString(), "wb"))) { error(-1, "Couldn't open image file '%s'", fName->getCString()); + delete fName; return; } @@ -1332,6 +1334,7 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, // Open the image file if (!(f1 = fopen(fName->getCString(), "wb"))) { error(-1, "Couldn't open image file '%s'", fName->getCString()); + delete fName; return; } commit 7be9198adb940ad7c5fffc6db0158cf7042e1b8f Author: Albert Astals Cid <[email protected]> Date: Tue Jan 6 01:24:15 2009 +0100 Do not leak pgNum and imgnum if fopen fails diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index 2b10628..19dcf7e 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -17,7 +17,7 @@ // 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 <[email protected]> +// Copyright (C) 2005-2009 Albert Astals Cid <[email protected]> // Copyright (C) 2008 Kjartan Maraas <[email protected]> // Copyright (C) 2008 Boris Toloknov <[email protected]> // Copyright (C) 2008 Haruyuki Kawabe <[email protected]> @@ -1198,6 +1198,9 @@ void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, GooString *imgnum=GooString::fromInt(imgNum); // open the image file fName->append(pgNum)->append("_")->append(imgnum)->append(".jpg"); + delete pgNum; + delete imgnum; + ++imgNum; if (!(f1 = fopen(fName->getCString(), "wb"))) { error(-1, "Couldn't open image file '%s'", fName->getCString()); @@ -1214,8 +1217,6 @@ void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, fclose(f1); - if (pgNum) delete pgNum; - if (imgnum) delete imgnum; if (fName) imgList->append(fName); } else { @@ -1284,6 +1285,9 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, // open the image file fName->append(pgNum)->append("_")->append(imgnum)->append(".jpg"); + delete pgNum; + delete imgnum; + ++imgNum; if (!(f1 = fopen(fName->getCString(), "wb"))) { @@ -1302,8 +1306,6 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, fclose(f1); if (fName) imgList->append(fName); - delete pgNum; - delete imgnum; } else { #ifdef ENABLE_LIBPNG @@ -1324,6 +1326,8 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, GooString *pgNum= GooString::fromInt(pageNum); GooString *imgnum= GooString::fromInt(imgNum); fName->append(pgNum)->append("_")->append(imgnum)->append(".png"); + delete pgNum; + delete imgnum; // Open the image file if (!(f1 = fopen(fName->getCString(), "wb"))) { @@ -1407,8 +1411,6 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, free(row); imgList->append(fName); ++imgNum; - delete pgNum; - delete imgnum; delete imgStr; #else OutputDev::drawImage(state, ref, str, width, height, colorMap, commit dfba6c022b150553cb2b18b027e661b3b4625ce7 Author: Warren Toomey <[email protected]> Date: Tue Jan 6 01:16:31 2009 +0100 Make pdftohtml output png images when the image stream is not a jpeg diff --git a/configure.ac b/configure.ac index 96ebe8d..010b77e 100644 --- a/configure.ac +++ b/configure.ac @@ -180,6 +180,19 @@ 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], + [Don't build against libpng.]), + enable_libpng=$enableval, + enable_libpng="try") +if test x$enable_libpng != xno; then + POPPLER_FIND_PNG +fi + +AM_CONDITIONAL(BUILD_LIBPNG, test x$enable_libpng = xyes) +AH_TEMPLATE([ENABLE_LIBPNG], + [Build against libpng.]) dnl Check for freetype headers FREETYPE_LIBS= @@ -493,6 +506,7 @@ echo " glib wrapper: $enable_poppler_glib" echo " use GDK: $enable_gdk" echo " use gtk-doc: $enable_gtk_doc" echo " use libjpeg: $enable_libjpeg" +echo " use libpng: $enable_libpng" echo " use zlib: $enable_zlib" echo " use libopenjpeg: $enable_libopenjpeg" echo " command line utils: $enable_utils" diff --git a/utils/HtmlOutputDev.cc b/utils/HtmlOutputDev.cc index 86bc2ef..2b10628 100644 --- a/utils/HtmlOutputDev.cc +++ b/utils/HtmlOutputDev.cc @@ -22,6 +22,7 @@ // Copyright (C) 2008 Boris Toloknov <[email protected]> // Copyright (C) 2008 Haruyuki Kawabe <[email protected]> // Copyright (C) 2008 Tomas Are Haavet <[email protected]> +// Copyright (C) 2009 Warren Toomey <[email protected]> // // 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 @@ -49,12 +50,16 @@ #ifdef ENABLE_LIBJPEG #include "DCTStream.h" #endif +#ifdef ENABLE_LIBPNG +#include "png.h" +#endif #include "GlobalParams.h" #include "HtmlOutputDev.h" #include "HtmlFonts.h" int HtmlPage::pgNum=0; int HtmlOutputDev::imgNum=1; +GooList *HtmlOutputDev::imgList=new GooList(); extern double scale; extern GBool complexMode; @@ -759,11 +764,14 @@ void HtmlPage::dump(FILE *f, int pageNum) else { fprintf(f,"<A name=%d></a>",pageNum); - GooString* fName=basename(DocName); - for (int i=1;i<HtmlOutputDev::imgNum;i++) - fprintf(f,"<IMG src=\"%s-%d_%d.jpg\"><br>\n",fName->getCString(),pageNum,i); + // Loop over the list of image names on this page + int listlen=HtmlOutputDev::imgList->getLength(); + for (int i = 0; i < listlen; i++) { + GooString *fName= (GooString *)HtmlOutputDev::imgList->del(0); + fprintf(f,"<IMG src=\"%s\"><br>\n",fName->getCString()); + delete fName; + } HtmlOutputDev::imgNum=1; - delete fName; GooString* str; for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){ @@ -1208,7 +1216,7 @@ void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, if (pgNum) delete pgNum; if (imgnum) delete imgnum; - if (fName) delete fName; + if (fName) imgList->append(fName); } else { OutputDev::drawImageMask(state, ref, str, width, height, invert, inlineImg); @@ -1293,13 +1301,119 @@ void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, fclose(f1); - delete fName; + if (fName) imgList->append(fName); delete pgNum; delete imgnum; } else { +#ifdef ENABLE_LIBPNG + // Dump the image as a PNG file. Much of the PNG code + // comes from an example by Guillaume Cottenceau. + Guchar *p; + GfxRGB rgb; + png_structp png_ptr; + png_infop info_ptr; + png_byte color_type= PNG_COLOR_TYPE_RGB; + png_byte bit_depth= 8; + png_byte *row = (png_byte *) malloc(3 * width); // 3 bytes/pixel: RGB + png_bytep *row_pointer= &row; + + // Create the image filename + GooString *fName=new GooString(Docname); + fName->append("-"); + GooString *pgNum= GooString::fromInt(pageNum); + GooString *imgnum= GooString::fromInt(imgNum); + fName->append(pgNum)->append("_")->append(imgnum)->append(".png"); + + // Open the image file + if (!(f1 = fopen(fName->getCString(), "wb"))) { + error(-1, "Couldn't open image file '%s'", fName->getCString()); + return; + } + + // Initialize the PNG stuff + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + if (!png_ptr) { + error(-1, "png_create_write_struct failed"); + return; + } + + info_ptr = png_create_info_struct(png_ptr); + if (!info_ptr) { + error(-1, "png_create_info_struct failed"); + return; + } + if (setjmp(png_jmpbuf(png_ptr))) { + error(-1, "error during init_io"); + return; + } + + // Write the PNG header + png_init_io(png_ptr, f1); + if (setjmp(png_jmpbuf(png_ptr))) { + error(-1, "error during writing png header"); + return; + } + + // Set up the type of PNG image and the compression level + png_set_compression_level(png_ptr, Z_BEST_COMPRESSION); + + png_set_IHDR(png_ptr, info_ptr, width, height, + bit_depth, color_type, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + + // Write the image info bytes + png_write_info(png_ptr, info_ptr); + if (setjmp(png_jmpbuf(png_ptr))) { + error(-1, "error during writing png info bytes"); + return; + } + + // 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(); + } + + // Write the row to the file + png_write_rows(png_ptr, row_pointer, 1); + if (setjmp(png_jmpbuf(png_ptr))) { + error(-1, "error during png row write"); + return; + } + } + + // Finish off the PNG file + png_write_end(png_ptr, info_ptr); + if (setjmp(png_jmpbuf(png_ptr))) { + error(-1, "error during png end of write"); + return; + } + + fclose(f1); + free(row); + imgList->append(fName); + ++imgNum; + delete pgNum; + delete imgnum; + delete imgStr; +#else OutputDev::drawImage(state, ref, str, width, height, colorMap, maskColors, inlineImg); +#endif } } diff --git a/utils/HtmlOutputDev.h b/utils/HtmlOutputDev.h index e42146b..a048a72 100644 --- a/utils/HtmlOutputDev.h +++ b/utils/HtmlOutputDev.h @@ -15,7 +15,7 @@ // under GPL version 2 or later // // Copyright (C) 2006-2007 Albert Astals Cid <[email protected]> -// Copyright (C) 2008 Warren Toomey <[email protected]> +// Copyright (C) 2008-2009 Warren Toomey <[email protected]> // // 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 @@ -316,6 +316,7 @@ private: int maxPageWidth; int maxPageHeight; static int imgNum; + static GooList *imgList; GooString *Docname; GooString *docTitle; GooList *glMetaVars; diff --git a/utils/Makefile.am b/utils/Makefile.am index 19e8a20..6042273 100644 --- a/utils/Makefile.am +++ b/utils/Makefile.am @@ -33,6 +33,10 @@ LDADD = \ $(UTILS_LIBS) \ $(FONTCONFIG_LIBS) +if BUILD_LIBPNG +pdftohtml_LDADD = $(LDADD) $(LIBPNG_LIBS) +endif + AM_LDFLAGS = @auto_import_flags@ bin_PROGRAMS = \ _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
