Albert Astals Cid <aa...@kde.org> writes:

> The discussion about C++11 was in my opinion not concluded, i.e. noone 
> contacted the people that [wrongly] use core library about if they can use C+
> +11, i'd prefer if you revert the change that needs C++11.

Yes, but the patch made poppler build with C++11, without using any
C++11 features in "public" header files, so it shouldn't affect
libraries using internal core api.

> Cheers,
>   Albert
>
>
> El dissabte, 17 de setembre de 2016, a les 12:55:19 CEST, Adrian Johnson va 
> escriure:
>>  cmake/modules/PopplerMacros.cmake |    2
>>  configure.ac                      |    1
>>  utils/pdfinfo.1                   |    4 +
>>  utils/pdfinfo.cc                  |  140
>> +++++++++++++++++++++++++++++++++++++- 4 files changed, 145 insertions(+),
>> 2 deletions(-)
>> 
>> New commits:
>> commit 183dbf3249e8db2398b63a749eb010bc0a89dc35
>> Author: Adrian Johnson <ajohn...@redneon.com>
>> Date:   Sat Sep 17 22:08:23 2016 +0930
>> 
>>     pdfinfo: add -dests option to print named destinations
>> 
>>     Bug 97262
>> 
>> diff --git a/cmake/modules/PopplerMacros.cmake
>> b/cmake/modules/PopplerMacros.cmake index 6cadf40..e9b75b9 100644
>> --- a/cmake/modules/PopplerMacros.cmake
>> +++ b/cmake/modules/PopplerMacros.cmake
>> @@ -104,7 +104,7 @@ if(CMAKE_COMPILER_IS_GNUCXX)
>>    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           
>>     "-std=c++11 -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") diff --git a/configure.ac b/configure.ac
>> index c4cfc2c..9ce36e1 100644
>> --- a/configure.ac
>> +++ b/configure.ac
>> @@ -85,6 +85,7 @@ AC_ARG_ENABLE(build-type,
>>                enable_build_type=no)
>> 
>>  if test "x$GCC" = "xyes"; then
>> +    CXXFLAGS="-std=c++11 $CXXFLAGS"
>>      case "$enable_build_type" in
>>      relwithdebinfo)
>>          CFLAGS="-O2 -g $CFLAGS"
>> diff --git a/utils/pdfinfo.1 b/utils/pdfinfo.1
>> index 741219f..b699dff 100644
>> --- a/utils/pdfinfo.1
>> +++ b/utils/pdfinfo.1
>> @@ -113,6 +113,10 @@ Prints dates in ISO-8601 format (including the time
>> zone). .B \-rawdates
>>  Prints the raw (undecoded) date strings, directly from the PDF file.
>>  .TP
>> +.B \-dests
>> +Print a list of all named destinations. If a page range is specified using
>> "\-f" and "\-l", only +destinations in the page range are listed.
>> +.TP
>>  .BI \-enc " encoding-name"
>>  Sets the encoding to use for text output. This defaults to "UTF-8".
>>  .TP
>> diff --git a/utils/pdfinfo.cc b/utils/pdfinfo.cc
>> index 9cfdc0f..50e756e 100644
>> --- a/utils/pdfinfo.cc
>> +++ b/utils/pdfinfo.cc
>> @@ -36,6 +36,7 @@
>>  #include <string.h>
>>  #include <time.h>
>>  #include <math.h>
>> +#include <map>
>>  #include "parseargs.h"
>>  #include "printencodings.h"
>>  #include "goo/GooString.h"
>> @@ -77,6 +78,7 @@ static GBool printHelp = gFalse;
>>  static GBool printEnc = gFalse;
>>  static GBool printStructure = gFalse;
>>  static GBool printStructureText = gFalse;
>> +static GBool printDests = gFalse;
>> 
>>  static const ArgDesc argDesc[] = {
>>    {"-f",      argInt,      &firstPage,        0,
>> @@ -97,6 +99,8 @@ static const ArgDesc argDesc[] = {
>>     "print the dates in ISO-8601 format"},
>>    {"-rawdates", argFlag,   &rawDates,         0,
>>     "print the undecoded date strings directly from the PDF file"},
>> +  {"-dests",     argFlag,  &printDests,       0,
>> +   "print all named destinations in the PDF"},
>>    {"-enc",    argString,   textEncName,    sizeof(textEncName),
>>     "output text encoding name"},
>>    {"-listenc",argFlag,     &printEnc,      0,
>> @@ -289,6 +293,135 @@ static void printStruct(const StructElement *element,
>> unsigned indent) { }
>>  }
>> 
>> +struct RefCompare {
>> +  bool operator() (const Ref& lhs, const Ref& rhs) const {
>> +    return lhs.num < rhs.num;
>> +  }
>> +};
>> +
>> +struct GooStringCompare {
>> +  bool operator() (GooString* lhs, GooString* rhs) const {
>> +    return lhs->cmp(const_cast<GooString*>(rhs)) < 0;
>> +  }
>> +};
>> +
>> +static void printLinkDest(LinkDest *dest) {
>> +  char buf[100];
>> +
>> +  switch (dest->getKind()) {
>> +    case destXYZ:
>> +      sprintf(buf, "[ XYZ ");
>> +      if (dest->getChangeLeft()) {
>> +    sprintf(buf+strlen(buf), "%4.f ", dest->getLeft());
>> +      } else {
>> +    strcat(buf, "null ");
>> +      }
>> +      if (dest->getChangeTop()) {
>> +    sprintf(buf+strlen(buf), "%4.f ", dest->getTop());
>> +      } else {
>> +    strcat(buf, "null ");
>> +      }
>> +      if (dest->getChangeZoom()) {
>> +    sprintf(buf+strlen(buf), "%4.2f ", dest->getZoom());
>> +      } else {
>> +    strcat(buf, "null ");
>> +      }
>> +      break;
>> +    case destFit:
>> +      sprintf(buf, "[ Fit ");
>> +      break;
>> +    case destFitH:
>> +      if (dest->getChangeTop()) {
>> +    sprintf(buf, "[ FitH %4.f ", dest->getTop());
>> +      } else {
>> +    sprintf(buf, "[ FitH null ");
>> +      }
>> +      break;
>> +    case destFitV:
>> +      if (dest->getChangeLeft()) {
>> +    sprintf(buf, "[ FitV %4.f ", dest->getLeft());
>> +      } else {
>> +    strcat(buf, "[ FitV null ");
>> +      }
>> +      break;
>> +    case destFitR:
>> +      sprintf(buf, "[ FitR %4.f %4.f %4.f %4.f ",
>> +          dest->getLeft(),
>> +          dest->getBottom(),
>> +          dest->getRight(),
>> +          dest->getTop());
>> +      break;
>> +    case destFitB:
>> +      sprintf(buf, "[ FitB ");
>> +      break;
>> +    case destFitBH:
>> +      if (dest->getChangeTop()) {
>> +    sprintf(buf, "[ FitBH %4.f ", dest->getTop());
>> +      } else {
>> +    sprintf(buf, "[ FitBH null ");
>> +      }
>> +      break;
>> +    case destFitBV:
>> +      if (dest->getChangeLeft()) {
>> +    sprintf(buf, "[ FitBV %4.f ", dest->getLeft());
>> +      } else {
>> +    strcat(buf, "[ FitBV null ");
>> +      }
>> +      break;
>> +  }
>> +
>> +  strcat(buf, "                                ");
>> +  buf[26] = ']';
>> +  buf[27] = 0;
>> +  printf(buf);
>> +}
>> +
>> +static void printDestinations(PDFDoc *doc, UnicodeMap *uMap) {
>> +  std::map<Ref,std::map<GooString*,LinkDest*,GooStringCompare>, RefCompare
>> > map; +
>> +  int numDests = doc->getCatalog()->numDestNameTree();
>> +  for (int i = 0; i < numDests; i++) {
>> +    GooString *name = doc->getCatalog()->getDestNameTreeName(i);
>> +    LinkDest *dest = doc->getCatalog()->getDestNameTreeDest(i);
>> +    if (dest->isPageRef()) {
>> +      map[dest->getPageRef()].insert(std::make_pair(name, dest));
>> +    }
>> +  }
>> +
>> +  numDests = doc->getCatalog()->numDests();
>> +  for (int i = 0; i < numDests; i++) {
>> +    GooString *name = new GooString(doc->getCatalog()->getDestsName(i));
>> +    LinkDest *dest = doc->getCatalog()->getDestsDest(i);
>> +    if (dest->isPageRef()) {
>> +      map[dest->getPageRef()].insert(std::make_pair(name, dest));
>> +    }
>> +  }
>> +
>> +  printf("Page  Destination                 Name\n");
>> +  for (int i = firstPage; i <= lastPage; i++) {
>> +    Ref *ref = doc->getCatalog()->getPageRef(i);
>> +    auto pageDests = map.find(*ref);
>> +    if (pageDests != map.end()) {
>> +      for (auto& it: pageDests->second) {
>> +    it.first->getCString()[4] = 0;
>> +    printf("%4d ", i);
>> +    printLinkDest(it.second);
>> +    printf(" \"");
>> +    Unicode *u;
>> +    char buf[8];
>> +    int n, len;
>> +    len = TextStringToUCS4(it.first, &u);
>> +    for (int i = 0; i < len; i++) {
>> +      n = uMap->mapUnicode(u[i], buf, sizeof(buf));
>> +      fwrite(buf, 1, n, stdout);
>> +    }
>> +    gfree(u);
>> +    printf("\"\n");
>> +      }
>> +    }
>> +  }
>> +}
>> +
>>  void printInfo(PDFDoc *doc, UnicodeMap *uMap, long long filesize, GBool
>> multiPage) { Page *page;
>>    Object info;
>> @@ -554,7 +687,6 @@ int main(int argc, char *argv[]) {
>>    }
>>    if (lastPage == 0) {
>>      multiPage = gFalse;
>> -    lastPage = 1;
>>    } else {
>>      multiPage = gTrue;
>>    }
>> @@ -588,6 +720,8 @@ int main(int argc, char *argv[]) {
>>      printStruct(structTree->getChild(i), 0);
>>        }
>>      }
>> +  } else if (printDests) {
>> +    printDestinations(doc, uMap);
>>    } else {
>>      // print info
>>      long long filesize = 0;
>> @@ -602,6 +736,10 @@ int main(int argc, char *argv[]) {
>>        filesize = Gftell(f);
>>        fclose(f);
>>      }
>> +
>> +    if (multiPage == gFalse)
>> +      lastPage = 1;
>> +
>>      printInfo(doc, uMap, filesize, multiPage);
>>    }
>>    exitCode = 0;
>> _______________________________________________
>> poppler mailing list
>> poppler@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/poppler
>
>
> _______________________________________________
> poppler mailing list
> poppler@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/poppler

-- 
Carlos Garcia Campos
PGP key: http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x523E6462

Attachment: signature.asc
Description: PGP signature

_______________________________________________
poppler mailing list
poppler@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to