mirror of
				https://github.com/RetroDECK/ES-DE.git
				synced 2025-04-10 19:15:13 +00:00 
			
		
		
		
	Removed the PoDoFo dependency and replaced its functionality with the Poppler library
This commit is contained in:
		
							parent
							
								
									aa3310e27b
								
							
						
					
					
						commit
						2fa71dfd0b
					
				|  | @ -1,66 +0,0 @@ | |||
| # - Try to find the PoDoFo library | ||||
| # | ||||
| # Windows users MUST set when building: | ||||
| # | ||||
| # PoDoFo_USE_SHARED - whether use PoDoFo as shared library | ||||
| # | ||||
| # Once done this will define: | ||||
| # | ||||
| # PoDoFo_FOUND - system has the PoDoFo library | ||||
| # PoDoFo_INCLUDE_DIRS - the PoDoFo include directory | ||||
| # PoDoFo_LIBRARIES - the libraries needed to use PoDoFo | ||||
| # PoDoFo_DEFINITIONS - the definitions needed to use PoDoFo | ||||
| # | ||||
| # SPDX-License-Identifier: BSD-3-Clause | ||||
| # SPDX-FileCopyrightText: 2016 Pino Toscano <pino@kde.org> | ||||
| 
 | ||||
| 
 | ||||
| find_path(PoDoFo_INCLUDE_DIRS | ||||
|   NAMES podofo/podofo.h | ||||
| ) | ||||
| find_library(PoDoFo_LIBRARIES | ||||
|   NAMES libpodofo podofo | ||||
| ) | ||||
| 
 | ||||
| include(FindPackageHandleStandardArgs) | ||||
| find_package_handle_standard_args(PoDoFo DEFAULT_MSG PoDoFo_LIBRARIES PoDoFo_INCLUDE_DIRS) | ||||
| 
 | ||||
| set(PoDoFo_DEFINITIONS) | ||||
| if(PoDoFo_FOUND) | ||||
|   if(WIN32) | ||||
|     if(NOT DEFINED PoDoFo_USE_SHARED) | ||||
|       message(SEND_ERROR "Win32 users MUST set PoDoFo_USE_SHARED") | ||||
|       message(SEND_ERROR "Set -DPoDoFo_USE_SHARED=0 if linking to a static library PoDoFo") | ||||
|       message(SEND_ERROR "or -DPoDoFo_USE_SHARED=1 if linking to a DLL build of PoDoFo") | ||||
|       message(FATAL_ERROR "PoDoFo_USE_SHARED unset on win32 build") | ||||
|     else() | ||||
|       if(PoDoFo_USE_SHARED) | ||||
|         set(PoDoFo_DEFINITIONS "${PoDoFo_DEFINITIONS} -DUSING_SHARED_PODOFO") | ||||
|       endif(PoDoFo_USE_SHARED) | ||||
|     endif() | ||||
|   endif() | ||||
| 
 | ||||
|   # PoDoFo-0.9.5 unconditionally includes openssl/opensslconf.h in a public | ||||
|   # header. The fix is in https://sourceforge.net/p/podofo/code/1830/ and will | ||||
|   # hopefully be released soon with 0.9.6. Note that krename doesn't use | ||||
|   # OpenSSL in any way. | ||||
|   file(STRINGS "${PoDoFo_INCLUDE_DIRS}/podofo/base/podofo_config.h" PoDoFo_MAJOR_VER_LINE REGEX "^#define[ \t]+PODOFO_VERSION_MAJOR[ \t]+[0-9]+$") | ||||
|   file(STRINGS "${PoDoFo_INCLUDE_DIRS}/podofo/base/podofo_config.h" PoDoFo_MINOR_VER_LINE REGEX "^#define[ \t]+PODOFO_VERSION_MINOR[ \t]+[0-9]+$") | ||||
|   file(STRINGS "${PoDoFo_INCLUDE_DIRS}/podofo/base/podofo_config.h" PoDoFo_PATCH_VER_LINE REGEX "^#define[ \t]+PODOFO_VERSION_PATCH[ \t]+[0-9]+$") | ||||
|   string(REGEX REPLACE "^#define[ \t]+PODOFO_VERSION_MAJOR[ \t]+([0-9]+)$" "\\1" PoDoFo_MAJOR_VER "${PoDoFo_MAJOR_VER_LINE}") | ||||
|   string(REGEX REPLACE "^#define[ \t]+PODOFO_VERSION_MINOR[ \t]+([0-9]+)$" "\\1" PoDoFo_MINOR_VER "${PoDoFo_MINOR_VER_LINE}") | ||||
|   string(REGEX REPLACE "^#define[ \t]+PODOFO_VERSION_PATCH[ \t]+([0-9]+)$" "\\1" PoDoFo_PATCH_VER "${PoDoFo_PATCH_VER_LINE}") | ||||
|   set(PoDoFo_VERSION "${PoDoFo_MAJOR_VER}.${PoDoFo_MINOR_VER}.${PoDoFo_PATCH_VER}") | ||||
|   if(PoDoFo_VERSION VERSION_EQUAL "0.9.5") | ||||
|     find_package(OpenSSL) | ||||
|     if (OpenSSL_FOUND) | ||||
|       message("OpenSSL found, which is required for this version of PoDofo (0.9.5)") | ||||
|       set(PoDoFo_INCLUDE_DIRS ${PoDoFo_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR}) | ||||
|     else() | ||||
|       unset(PoDoFo_FOUND) | ||||
|       message("OpenSSL NOT found, which is required for this version of PoDofo (0.9.5)") | ||||
|     endif() | ||||
|   endif() | ||||
| endif() | ||||
| 
 | ||||
| mark_as_advanced(PoDoFo_INCLUDE_DIRS PoDoFo_LIBRARIES PoDoFo_DEFINITIONS) | ||||
|  | @ -135,7 +135,6 @@ elseif(NOT EMSCRIPTEN) | |||
|     find_package(FreeImage REQUIRED) | ||||
|     find_package(Freetype REQUIRED) | ||||
|     find_package(Libgit2 REQUIRED) | ||||
|     find_package(PoDoFo REQUIRED) | ||||
|     find_package(Pugixml REQUIRED) | ||||
|     find_package(SDL2 REQUIRED) | ||||
| endif() | ||||
|  | @ -456,7 +455,6 @@ else() | |||
|                             ${FreeImage_INCLUDE_DIRS} | ||||
|                             ${FREETYPE_INCLUDE_DIRS} | ||||
|                             ${GIT2_INCLUDE_PATH} | ||||
|                             ${PoDoFo_INCLUDE_DIRS} | ||||
|                             ${PUGIXML_INCLUDE_DIRS} | ||||
|                             ${SDL2_INCLUDE_DIR}) | ||||
| endif() | ||||
|  | @ -573,7 +571,6 @@ else() | |||
|                          ${FreeImage_LIBRARIES} | ||||
|                          ${FREETYPE_LIBRARIES} | ||||
|                          ${GIT2_LIBRARY} | ||||
|                          ${PoDoFo_LIBRARIES} | ||||
|                          ${PUGIXML_LIBRARIES} | ||||
|                          ${SDL2_LIBRARY}) | ||||
| endif() | ||||
|  |  | |||
|  | @ -3,8 +3,7 @@ | |||
| //  EmulationStation Desktop Edition
 | ||||
| //  PDFViewer.cpp
 | ||||
| //
 | ||||
| //  Parses PDF documents using the PoDoFo library and renders pages using the Poppler
 | ||||
| //  library via the external es-pdf-convert binary.
 | ||||
| //  Parses and renders pages using the Poppler library via the external es-pdf-convert binary.
 | ||||
| //
 | ||||
| 
 | ||||
| #include "PDFViewer.h" | ||||
|  | @ -12,6 +11,7 @@ | |||
| #include "Log.h" | ||||
| #include "Sound.h" | ||||
| #include "utils/FileSystemUtil.h" | ||||
| #include "utils/StringUtil.h" | ||||
| 
 | ||||
| #define DEBUG_PDF_CONVERSION false | ||||
| 
 | ||||
|  | @ -20,12 +20,16 @@ PDFViewer::PDFViewer() | |||
| { | ||||
|     Window::getInstance()->setPDFViewer(this); | ||||
|     mTexture = TextureResource::get(""); | ||||
|     mPages.clear(); | ||||
|     mPageImage.reset(); | ||||
| } | ||||
| 
 | ||||
| bool PDFViewer::startPDFViewer(FileData* game) | ||||
| { | ||||
|     mESConvertPath = Utils::FileSystem::getExePath() + "/es-pdf-convert"; | ||||
|     if (!Utils::FileSystem::exists(mESConvertPath)) { | ||||
|         LOG(LogError) << "Couldn't find PDF conversion binary es-pdf-convert"; | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     mManualPath = game->getManualPath(); | ||||
| 
 | ||||
|     if (!Utils::FileSystem::exists(mManualPath)) { | ||||
|  | @ -35,67 +39,29 @@ bool PDFViewer::startPDFViewer(FileData* game) | |||
| 
 | ||||
|     LOG(LogDebug) << "PDFViewer::startPDFViewer(): Opening document \"" << mManualPath << "\""; | ||||
| 
 | ||||
|     PoDoFo::PdfMemDocument pdf; | ||||
|     mPages.clear(); | ||||
|     mPageImage.reset(); | ||||
|     mPageCount = 0; | ||||
|     mCurrentPage = 0; | ||||
|     mScaleFactor = 1.0f; | ||||
| 
 | ||||
|     try { | ||||
|         pdf.Load(mManualPath.c_str()); | ||||
|     } | ||||
|     catch (PoDoFo::PdfError& e) { | ||||
|         LOG(LogError) << "PDFViewer: Couldn't load file \"" << mManualPath << "\", PoDoFo error \"" | ||||
|                       << e.what() << ": " << e.ErrorMessage(e.GetError()) << "\""; | ||||
|     if (!getDocumentInfo()) { | ||||
|         LOG(LogError) << "PDFViewer: Couldn't load file \"" << mManualPath; | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
| #if (DEBUG_PDF_CONVERSION) | ||||
|     PoDoFo::EPdfVersion versionEPdf {pdf.GetPdfVersion()}; | ||||
|     std::string version {"unknown"}; | ||||
|     mPageCount = mPages.size(); | ||||
| 
 | ||||
|     switch (versionEPdf) { | ||||
|         case 0: | ||||
|             version = "1.0"; | ||||
|             break; | ||||
|         case 1: | ||||
|             version = "1.1"; | ||||
|             break; | ||||
|         case 2: | ||||
|             version = "1.2"; | ||||
|             break; | ||||
|         case 3: | ||||
|             version = "1.3"; | ||||
|             break; | ||||
|         case 4: | ||||
|             version = "1.4"; | ||||
|             break; | ||||
|         case 5: | ||||
|             version = "1.5"; | ||||
|             break; | ||||
|         case 6: | ||||
|             version = "1.6"; | ||||
|             break; | ||||
|         case 7: | ||||
|             version = "1.7"; | ||||
|             break; | ||||
|         default: | ||||
|             version = "unknown"; | ||||
|     }; | ||||
|     for (int i {1}; i <= mPageCount; ++i) { | ||||
|         if (mPages.find(i) == mPages.end()) { | ||||
|             LOG(LogError) << "Couldn't read information for page " << i << ", invalid PDF file?"; | ||||
|             return false; | ||||
|         } | ||||
| 
 | ||||
|     LOG(LogDebug) << "PDF version: " << version; | ||||
|     LOG(LogDebug) << "Page count: " << pdf.GetPageCount(); | ||||
| #endif | ||||
|         float width {mPages[i].width}; | ||||
|         float height {mPages[i].height}; | ||||
| 
 | ||||
|     mPageCount = static_cast<int>(pdf.GetPageCount()); | ||||
| 
 | ||||
|     for (int i {0}; i < mPageCount; ++i) { | ||||
|         const int rotation {pdf.GetPage(i)->GetRotation()}; | ||||
|         const PoDoFo::PdfRect cropBox {pdf.GetPage(i)->GetCropBox()}; | ||||
|         float width {static_cast<float>(cropBox.GetWidth())}; | ||||
|         float height {static_cast<float>(cropBox.GetHeight())}; | ||||
| 
 | ||||
|         if (rotation != 0 && rotation != 180) | ||||
|         if (!mPages[i].portraitOrientation) | ||||
|             std::swap(width, height); | ||||
| 
 | ||||
|         // Maintain page aspect ratio.
 | ||||
|  | @ -113,18 +79,17 @@ bool PDFViewer::startPDFViewer(FileData* game) | |||
|             textureSize.x = std::min((textureSize.y / height) * width, targetSize.x); | ||||
|         } | ||||
| 
 | ||||
|         const int textureWidth {static_cast<int>(std::round(textureSize.x))}; | ||||
|         const int textureHeight {static_cast<int>(std::round(textureSize.y))}; | ||||
|         mPages[i].width = std::round(textureSize.x); | ||||
|         mPages[i].height = std::round(textureSize.y); | ||||
| 
 | ||||
| #if (DEBUG_PDF_CONVERSION) | ||||
|         LOG(LogDebug) << "Page " << i + 1 << ": Rotation: " << rotation << " degrees / " | ||||
|                       << "Crop box width: " << width << " / " | ||||
|                       << "Crop box height: " << height << " / " | ||||
|                       << "Size ratio: " << width / height << " / " | ||||
|                       << "Texture size: " << textureWidth << "x" << textureHeight; | ||||
|         LOG(LogDebug) << "Page " << i << ": Orientation: " | ||||
|                       << (mPages[i].portraitOrientation ? "portrait" : "landscape") << " / " | ||||
|                       << "crop box width: " << width << " / " | ||||
|                       << "crop box height: " << height << " / " | ||||
|                       << "size ratio: " << width / height << " / " | ||||
|                       << "texture size: " << mPages[i].width << "x" << mPages[i].height; | ||||
| #endif | ||||
| 
 | ||||
|         mPages[i + 1] = PageEntry {textureWidth, textureHeight, {}}; | ||||
|     } | ||||
| 
 | ||||
|     mCurrentPage = 1; | ||||
|  | @ -139,25 +104,61 @@ void PDFViewer::stopPDFViewer() | |||
|     mPageImage.reset(); | ||||
| } | ||||
| 
 | ||||
| bool PDFViewer::getDocumentInfo() | ||||
| { | ||||
|     FILE* commandPipe; | ||||
|     std::array<char, 512> buffer {}; | ||||
|     std::string commandOutput; | ||||
| 
 | ||||
|     std::string command {Utils::FileSystem::getEscapedPath(mESConvertPath)}; | ||||
|     command.append(" -fileinfo ").append(Utils::FileSystem::getEscapedPath(mManualPath)); | ||||
| 
 | ||||
|     if (!(commandPipe = reinterpret_cast<FILE*>(popen(command.c_str(), "r")))) { | ||||
|         LOG(LogError) << "Couldn't open pipe to es-pdf-convert"; | ||||
|         return false; | ||||
|     } | ||||
| 
 | ||||
|     while (fread(buffer.data(), 1, 512, commandPipe)) { | ||||
|         for (int i {0}; i < 512; ++i) { | ||||
|             if (buffer[i] == '\0') | ||||
|                 break; | ||||
|             commandOutput.append(1, buffer[i]); | ||||
|         } | ||||
|         buffer.fill('\0'); | ||||
|     } | ||||
| 
 | ||||
|     if (pclose(commandPipe) != 0) | ||||
|         return false; | ||||
| 
 | ||||
|     const std::vector<std::string> pageRows { | ||||
|         Utils::String::delimitedStringToVector(commandOutput, "\n")}; | ||||
| 
 | ||||
|     for (auto& row : pageRows) { | ||||
|         const std::vector<std::string> rowValues {Utils::String::delimitedStringToVector(row, ";")}; | ||||
|         if (rowValues.size() != 4) | ||||
|             continue; | ||||
|         mPages[atoi(&rowValues[0][0])] = PageEntry {static_cast<float>(atof(&rowValues[2][0])), | ||||
|                                                     static_cast<float>(atof(&rowValues[3][0])), | ||||
|                                                     (rowValues[1] == "portrait" ? true : false), | ||||
|                                                     {}}; | ||||
|     } | ||||
| 
 | ||||
|     return true; | ||||
| } | ||||
| 
 | ||||
| void PDFViewer::convertPage(int pageNum) | ||||
| { | ||||
|     assert(pageNum <= static_cast<int>(mPages.size())); | ||||
| 
 | ||||
|     const std::string esConvertPath {Utils::FileSystem::getExePath() + "/es-pdf-convert"}; | ||||
|     if (!Utils::FileSystem::exists(esConvertPath)) { | ||||
|         LOG(LogError) << "Couldn't find PDF conversion binary es-pdf-convert"; | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     std::string command {Utils::FileSystem::getEscapedPath(esConvertPath)}; | ||||
|     command.append(" ") | ||||
|     std::string command {Utils::FileSystem::getEscapedPath(mESConvertPath)}; | ||||
|     command.append(" -convert ") | ||||
|         .append(Utils::FileSystem::getEscapedPath(mManualPath)) | ||||
|         .append(" ") | ||||
|         .append(std::to_string(pageNum)) | ||||
|         .append(" ") | ||||
|         .append(std::to_string(mPages[pageNum].width)) | ||||
|         .append(std::to_string(static_cast<int>(mPages[pageNum].width))) | ||||
|         .append(" ") | ||||
|         .append(std::to_string(mPages[pageNum].height)); | ||||
|         .append(std::to_string(static_cast<int>(mPages[pageNum].height))); | ||||
| 
 | ||||
|     if (mPages[pageNum].imageData.empty()) { | ||||
| #if (DEBUG_PDF_CONVERSION) | ||||
|  | @ -206,7 +207,8 @@ void PDFViewer::convertPage(int pageNum) | |||
|     mPageImage->setMaxSize( | ||||
|         glm::vec2 {mPages[pageNum].width / mScaleFactor, mPages[pageNum].height / mScaleFactor}); | ||||
|     mPageImage->setRawImage(reinterpret_cast<const unsigned char*>(&mPages[pageNum].imageData[0]), | ||||
|                             mPages[pageNum].width, mPages[pageNum].height); | ||||
|                             static_cast<size_t>(mPages[pageNum].width), | ||||
|                             static_cast<size_t>(mPages[pageNum].height)); | ||||
| 
 | ||||
| #if (DEBUG_PDF_CONVERSION) | ||||
|     LOG(LogDebug) << "ABGR32 data stream size: " << mPages[pageNum].imageData.size(); | ||||
|  |  | |||
|  | @ -3,8 +3,7 @@ | |||
| //  EmulationStation Desktop Edition
 | ||||
| //  PDFViewer.h
 | ||||
| //
 | ||||
| //  Parses PDF documents using the PoDoFo library and renders pages using the Poppler
 | ||||
| //  library via the external es-pdf-convert binary.
 | ||||
| //  Parses and renders pages using the Poppler library via the external es-pdf-convert binary.
 | ||||
| //
 | ||||
| 
 | ||||
| #ifndef ES_APP_PDF_VIEWER_H | ||||
|  | @ -14,8 +13,6 @@ | |||
| #include "Window.h" | ||||
| #include "components/ImageComponent.h" | ||||
| 
 | ||||
| #include <podofo/podofo.h> | ||||
| 
 | ||||
| class PDFViewer : public Window::PDFViewer | ||||
| { | ||||
| public: | ||||
|  | @ -25,6 +22,7 @@ public: | |||
|     bool startPDFViewer(FileData* game) override; | ||||
|     void stopPDFViewer() override; | ||||
| 
 | ||||
|     bool getDocumentInfo(); | ||||
|     void convertPage(int pageNum); | ||||
| 
 | ||||
|     void render(const glm::mat4& parentTrans) override; | ||||
|  | @ -36,8 +34,9 @@ private: | |||
|     void showLastPage() override; | ||||
| 
 | ||||
|     struct PageEntry { | ||||
|         int width; | ||||
|         int height; | ||||
|         float width; | ||||
|         float height; | ||||
|         bool portraitOrientation; | ||||
|         std::vector<char> imageData; | ||||
|     }; | ||||
| 
 | ||||
|  | @ -46,11 +45,12 @@ private: | |||
|     std::unique_ptr<ImageComponent> mPageImage; | ||||
|     std::map<int, PageEntry> mPages; | ||||
| 
 | ||||
|     std::string mESConvertPath; | ||||
|     std::string mManualPath; | ||||
| 
 | ||||
|     float mScaleFactor; | ||||
|     int mCurrentPage; | ||||
|     int mPageCount; | ||||
| 
 | ||||
|     std::string mManualPath; | ||||
| }; | ||||
| 
 | ||||
| #endif // ES_APP_PDF_VIEWER_H
 | ||||
|  |  | |||
|  | @ -128,7 +128,7 @@ void ImageComponent::setImage(const std::shared_ptr<TextureResource>& texture, b | |||
|         resize(); | ||||
| } | ||||
| 
 | ||||
| void ImageComponent::setRawImage(const unsigned char* data, float width, float height) | ||||
| void ImageComponent::setRawImage(const unsigned char* data, size_t width, size_t height) | ||||
| { | ||||
|     mTexture.reset(); | ||||
|     mTexture = TextureResource::get(""); | ||||
|  |  | |||
|  | @ -30,7 +30,7 @@ public: | |||
|     // Use an already existing texture.
 | ||||
|     void setImage(const std::shared_ptr<TextureResource>& texture, bool resizeTexture = true); | ||||
|     // Loads a texture using raw image pixel data.
 | ||||
|     void setRawImage(const unsigned char* data, float width, float height); | ||||
|     void setRawImage(const unsigned char* data, size_t width, size_t height); | ||||
| 
 | ||||
|     // Sets per-game overrides of static images using the game file basename.
 | ||||
|     void setGameOverrideImage(const std::string& basename, const std::string& system) override; | ||||
|  |  | |||
|  | @ -21,43 +21,95 @@ | |||
| 
 | ||||
| int main(int argc, char* argv[]) | ||||
| { | ||||
|     if (argc != 5) { | ||||
|         std::cout << "Usage: es-pdf-convert <filename> <page number> <horizontal resolution> " | ||||
|                      "<vertical resolution>" | ||||
|     bool validArguments {true}; | ||||
|     std::string mode; | ||||
| 
 | ||||
|     if (argc < 3) | ||||
|         validArguments = false; | ||||
|     else | ||||
|         mode = argv[1]; | ||||
| 
 | ||||
|     if ((mode == "-fileinfo" && argc != 3) || (mode == "-convert" && argc != 6)) | ||||
|         validArguments = false; | ||||
| 
 | ||||
|     if (!validArguments) { | ||||
|         std::cout << "This binary is only intended to be executed by emulationstation (ES-DE)" | ||||
|                   << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
|     const std::string path {argv[1]}; | ||||
|     const int pageNum {atoi(argv[2])}; | ||||
|     const int width {atoi(argv[3])}; | ||||
|     const int height {atoi(argv[4])}; | ||||
|     const std::string path {argv[2]}; | ||||
|     int pageNum {0}; | ||||
|     int width {0}; | ||||
|     int height {0}; | ||||
| 
 | ||||
|     if (width < 1 || width > 7680) { | ||||
|         std::cerr << "Invalid horizontal resolution defined: " << argv[3] << std::endl; | ||||
|         exit(-1); | ||||
|     if (mode == "-convert") { | ||||
|         pageNum = atoi(argv[3]); | ||||
|         width = atoi(argv[4]); | ||||
|         height = atoi(argv[5]); | ||||
| 
 | ||||
|         if (width < 1 || width > 7680) { | ||||
|             std::cerr << "Invalid horizontal resolution defined: " << argv[3] << std::endl; | ||||
|             exit(-1); | ||||
|         } | ||||
| 
 | ||||
|         if (height < 1 || height > 7680) { | ||||
|             std::cerr << "Invalid vertical resolution defined: " << argv[4] << std::endl; | ||||
|             exit(-1); | ||||
|         } | ||||
| 
 | ||||
|         // std::cerr << "Converting file \"" << path << "\", page " << pageNum << " to resolution "
 | ||||
|         //          << width << "x" << height << " pixels" << std::endl;
 | ||||
|     } | ||||
| 
 | ||||
|     if (height < 1 || height > 7680) { | ||||
|         std::cerr << "Invalid vertical resolution defined: " << argv[4] << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
|     // std::cerr << "Converting file \"" << path << "\", page " << pageNum << " to resolution "
 | ||||
|     //          << width << "x" << height << " pixels" << std::endl;
 | ||||
| 
 | ||||
|     const poppler::document* document {poppler::document::load_from_file(path)}; | ||||
| 
 | ||||
|     if (document == nullptr) | ||||
|     if (document == nullptr) { | ||||
|         std::cerr << "Error: Couldn't open document, invalid PDF file?" << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
|     if (pageNum < 1 || pageNum > document->pages()) { | ||||
|     const int pageCount {document->pages()}; | ||||
| 
 | ||||
|     if (mode == "-fileinfo") { | ||||
|         std::vector<std::string> pageInfo; | ||||
|         for (int i {0}; i < pageCount; ++i) { | ||||
|             std::string pageRow; | ||||
|             const poppler::page* page {document->create_page(i)}; | ||||
|             if (page == nullptr) { | ||||
|                 if (page == nullptr) { | ||||
|                     std::cerr << "Error: Couldn't read page " << i + 1 << std::endl; | ||||
|                     exit(-1); | ||||
|                 } | ||||
|             } | ||||
|             const poppler::rectf pageRect {page->page_rect()}; | ||||
|             pageRow.append(std::to_string(i + 1)) | ||||
|                 .append(";") | ||||
|                 .append(page->orientation() == poppler::page::portrait ? "portrait" : "landscape") | ||||
|                 .append(";") | ||||
|                 .append(std::to_string(pageRect.width())) | ||||
|                 .append(";") | ||||
|                 .append(std::to_string(pageRect.height())); | ||||
|             pageInfo.emplace_back(pageRow); | ||||
|         } | ||||
|         for (auto& row : pageInfo) | ||||
|             std::cout << row << std::endl; | ||||
|         exit(0); | ||||
|     } | ||||
| 
 | ||||
|     if (pageNum < 1 || pageNum > pageCount) { | ||||
|         std::cerr << "Error: Requested page " << pageNum << " does not exist in document" | ||||
|                   << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
|     const poppler::page* page {document->create_page(pageNum - 1)}; | ||||
| 
 | ||||
|     if (page == nullptr) { | ||||
|         std::cerr << "Error: Couldn't read page " << pageNum << std::endl; | ||||
|         exit(-1); | ||||
|     } | ||||
| 
 | ||||
|     poppler::page_renderer pageRenderer; | ||||
| 
 | ||||
|     pageRenderer.set_render_hint(poppler::page_renderer::text_antialiasing); | ||||
|  |  | |||
							
								
								
									
										481
									
								
								licenses/PoDoFo
									
									
									
									
									
								
							
							
						
						
									
										481
									
								
								licenses/PoDoFo
									
									
									
									
									
								
							|  | @ -1,481 +0,0 @@ | |||
| 		  GNU LIBRARY GENERAL PUBLIC LICENSE | ||||
| 		       Version 2, June 1991 | ||||
| 
 | ||||
|  Copyright (C) 1991 Free Software Foundation, Inc. | ||||
|                     59 Temple Place - Suite 330 | ||||
|                     Boston, MA 02111-1307, USA. | ||||
|  Everyone is permitted to copy and distribute verbatim copies | ||||
|  of this license document, but changing it is not allowed. | ||||
| 
 | ||||
| [This is the first released version of the library GPL.  It is | ||||
|  numbered 2 because it goes with version 2 of the ordinary GPL.] | ||||
| 
 | ||||
| 			    Preamble | ||||
| 
 | ||||
|   The licenses for most software are designed to take away your | ||||
| freedom to share and change it.  By contrast, the GNU General Public | ||||
| Licenses are intended to guarantee your freedom to share and change | ||||
| free software--to make sure the software is free for all its users. | ||||
| 
 | ||||
|   This license, the Library General Public License, applies to some | ||||
| specially designated Free Software Foundation software, and to any | ||||
| other libraries whose authors decide to use it.  You can use it for | ||||
| your libraries, 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 library, or if you modify it. | ||||
| 
 | ||||
|   For example, if you distribute copies of the library, whether gratis | ||||
| or for a fee, you must give the recipients all the rights that we gave | ||||
| you.  You must make sure that they, too, receive or can get the source | ||||
| code.  If you link a program with the library, you must provide | ||||
| complete object files to the recipients so that they can relink them | ||||
| with the library, after making changes to the library and recompiling | ||||
| it.  And you must show them these terms so they know their rights. | ||||
| 
 | ||||
|   Our method of protecting your rights has two steps: (1) copyright | ||||
| the library, and (2) offer you this license which gives you legal | ||||
| permission to copy, distribute and/or modify the library. | ||||
| 
 | ||||
|   Also, for each distributor's protection, we want to make certain | ||||
| that everyone understands that there is no warranty for this free | ||||
| library.  If the library is modified by someone else and passed on, we | ||||
| want its recipients to know that what they have is not the original | ||||
| version, 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 companies distributing free | ||||
| software will individually obtain patent licenses, thus in effect | ||||
| transforming the program into proprietary software.  To prevent this, | ||||
| we have made it clear that any patent must be licensed for everyone's | ||||
| free use or not licensed at all. | ||||
| 
 | ||||
|   Most GNU software, including some libraries, is covered by the ordinary | ||||
| GNU General Public License, which was designed for utility programs.  This | ||||
| license, the GNU Library General Public License, applies to certain | ||||
| designated libraries.  This license is quite different from the ordinary | ||||
| one; be sure to read it in full, and don't assume that anything in it is | ||||
| the same as in the ordinary license. | ||||
| 
 | ||||
|   The reason we have a separate public license for some libraries is that | ||||
| they blur the distinction we usually make between modifying or adding to a | ||||
| program and simply using it.  Linking a program with a library, without | ||||
| changing the library, is in some sense simply using the library, and is | ||||
| analogous to running a utility program or application program.  However, in | ||||
| a textual and legal sense, the linked executable is a combined work, a | ||||
| derivative of the original library, and the ordinary General Public License | ||||
| treats it as such. | ||||
| 
 | ||||
|   Because of this blurred distinction, using the ordinary General | ||||
| Public License for libraries did not effectively promote software | ||||
| sharing, because most developers did not use the libraries.  We | ||||
| concluded that weaker conditions might promote sharing better. | ||||
| 
 | ||||
|   However, unrestricted linking of non-free programs would deprive the | ||||
| users of those programs of all benefit from the free status of the | ||||
| libraries themselves.  This Library General Public License is intended to | ||||
| permit developers of non-free programs to use free libraries, while | ||||
| preserving your freedom as a user of such programs to change the free | ||||
| libraries that are incorporated in them.  (We have not seen how to achieve | ||||
| this as regards changes in header files, but we have achieved it as regards | ||||
| changes in the actual functions of the Library.)  The hope is that this | ||||
| will lead to faster development of free libraries. | ||||
| 
 | ||||
|   The precise terms and conditions for copying, distribution and | ||||
| modification follow.  Pay close attention to the difference between a | ||||
| "work based on the library" and a "work that uses the library".  The | ||||
| former contains code derived from the library, while the latter only | ||||
| works together with the library. | ||||
| 
 | ||||
|   Note that it is possible for a library to be covered by the ordinary | ||||
| General Public License rather than by this special one. | ||||
|  | ||||
| 		  GNU LIBRARY GENERAL PUBLIC LICENSE | ||||
|    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | ||||
| 
 | ||||
|   0. This License Agreement applies to any software library which | ||||
| contains a notice placed by the copyright holder or other authorized | ||||
| party saying it may be distributed under the terms of this Library | ||||
| General Public License (also called "this License").  Each licensee is | ||||
| addressed as "you". | ||||
| 
 | ||||
|   A "library" means a collection of software functions and/or data | ||||
| prepared so as to be conveniently linked with application programs | ||||
| (which use some of those functions and data) to form executables. | ||||
| 
 | ||||
|   The "Library", below, refers to any such software library or work | ||||
| which has been distributed under these terms.  A "work based on the | ||||
| Library" means either the Library or any derivative work under | ||||
| copyright law: that is to say, a work containing the Library or a | ||||
| portion of it, either verbatim or with modifications and/or translated | ||||
| straightforwardly into another language.  (Hereinafter, translation is | ||||
| included without limitation in the term "modification".) | ||||
| 
 | ||||
|   "Source code" for a work means the preferred form of the work for | ||||
| making modifications to it.  For a library, 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 library. | ||||
| 
 | ||||
|   Activities other than copying, distribution and modification are not | ||||
| covered by this License; they are outside its scope.  The act of | ||||
| running a program using the Library is not restricted, and output from | ||||
| such a program is covered only if its contents constitute a work based | ||||
| on the Library (independent of the use of the Library in a tool for | ||||
| writing it).  Whether that is true depends on what the Library does | ||||
| and what the program that uses the Library does. | ||||
|    | ||||
|   1. You may copy and distribute verbatim copies of the Library's | ||||
| complete 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 distribute a copy of this License along with the | ||||
| Library. | ||||
| 
 | ||||
|   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 Library or any portion | ||||
| of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. | ||||
| 
 | ||||
|     b) You must cause the files modified to carry prominent notices | ||||
|     stating that you changed the files and the date of any change. | ||||
| 
 | ||||
|     c) You must cause the whole of the work to be licensed at no | ||||
|     charge to all third parties under the terms of this License. | ||||
| 
 | ||||
|     d) If a facility in the modified Library refers to a function or a | ||||
|     table of data to be supplied by an application program that uses | ||||
|     the facility, other than as an argument passed when the facility | ||||
|     is invoked, then you must make a good faith effort to ensure that, | ||||
|     in the event an application does not supply such function or | ||||
|     table, the facility still operates, and performs whatever part of | ||||
|     its purpose remains meaningful. | ||||
| 
 | ||||
|     (For example, a function in a library to compute square roots has | ||||
|     a purpose that is entirely well-defined independent of the | ||||
|     application.  Therefore, Subsection 2d requires that any | ||||
|     application-supplied function or table used by this function must | ||||
|     be optional: if the application does not supply it, the square | ||||
|     root function must still compute square roots.) | ||||
| 
 | ||||
| These requirements apply to the modified work as a whole.  If | ||||
| identifiable sections of that work are not derived from the Library, | ||||
| 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 Library, 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 Library. | ||||
| 
 | ||||
| In addition, mere aggregation of another work not based on the Library | ||||
| with the Library (or with a work based on the Library) on a volume of | ||||
| a storage or distribution medium does not bring the other work under | ||||
| the scope of this License. | ||||
| 
 | ||||
|   3. You may opt to apply the terms of the ordinary GNU General Public | ||||
| License instead of this License to a given copy of the Library.  To do | ||||
| this, you must alter all the notices that refer to this License, so | ||||
| that they refer to the ordinary GNU General Public License, version 2, | ||||
| instead of to this License.  (If a newer version than version 2 of the | ||||
| ordinary GNU General Public License has appeared, then you can specify | ||||
| that version instead if you wish.)  Do not make any other change in | ||||
| these notices. | ||||
|  | ||||
|   Once this change is made in a given copy, it is irreversible for | ||||
| that copy, so the ordinary GNU General Public License applies to all | ||||
| subsequent copies and derivative works made from that copy. | ||||
| 
 | ||||
|   This option is useful when you wish to copy part of the code of | ||||
| the Library into a program that is not a library. | ||||
| 
 | ||||
|   4. You may copy and distribute the Library (or a portion or | ||||
| derivative of it, under Section 2) in object code or executable form | ||||
| under the terms of Sections 1 and 2 above provided that you 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. | ||||
| 
 | ||||
|   If distribution of 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 satisfies the requirement to | ||||
| distribute the source code, even though third parties are not | ||||
| compelled to copy the source along with the object code. | ||||
| 
 | ||||
|   5. A program that contains no derivative of any portion of the | ||||
| Library, but is designed to work with the Library by being compiled or | ||||
| linked with it, is called a "work that uses the Library".  Such a | ||||
| work, in isolation, is not a derivative work of the Library, and | ||||
| therefore falls outside the scope of this License. | ||||
| 
 | ||||
|   However, linking a "work that uses the Library" with the Library | ||||
| creates an executable that is a derivative of the Library (because it | ||||
| contains portions of the Library), rather than a "work that uses the | ||||
| library".  The executable is therefore covered by this License. | ||||
| Section 6 states terms for distribution of such executables. | ||||
| 
 | ||||
|   When a "work that uses the Library" uses material from a header file | ||||
| that is part of the Library, the object code for the work may be a | ||||
| derivative work of the Library even though the source code is not. | ||||
| Whether this is true is especially significant if the work can be | ||||
| linked without the Library, or if the work is itself a library.  The | ||||
| threshold for this to be true is not precisely defined by law. | ||||
| 
 | ||||
|   If such an object file uses only numerical parameters, data | ||||
| structure layouts and accessors, and small macros and small inline | ||||
| functions (ten lines or less in length), then the use of the object | ||||
| file is unrestricted, regardless of whether it is legally a derivative | ||||
| work.  (Executables containing this object code plus portions of the | ||||
| Library will still fall under Section 6.) | ||||
| 
 | ||||
|   Otherwise, if the work is a derivative of the Library, you may | ||||
| distribute the object code for the work under the terms of Section 6. | ||||
| Any executables containing that work also fall under Section 6, | ||||
| whether or not they are linked directly with the Library itself. | ||||
|  | ||||
|   6. As an exception to the Sections above, you may also compile or | ||||
| link a "work that uses the Library" with the Library to produce a | ||||
| work containing portions of the Library, and distribute that work | ||||
| under terms of your choice, provided that the terms permit | ||||
| modification of the work for the customer's own use and reverse | ||||
| engineering for debugging such modifications. | ||||
| 
 | ||||
|   You must give prominent notice with each copy of the work that the | ||||
| Library is used in it and that the Library and its use are covered by | ||||
| this License.  You must supply a copy of this License.  If the work | ||||
| during execution displays copyright notices, you must include the | ||||
| copyright notice for the Library among them, as well as a reference | ||||
| directing the user to the copy of this License.  Also, you must do one | ||||
| of these things: | ||||
| 
 | ||||
|     a) Accompany the work with the complete corresponding | ||||
|     machine-readable source code for the Library including whatever | ||||
|     changes were used in the work (which must be distributed under | ||||
|     Sections 1 and 2 above); and, if the work is an executable linked | ||||
|     with the Library, with the complete machine-readable "work that | ||||
|     uses the Library", as object code and/or source code, so that the | ||||
|     user can modify the Library and then relink to produce a modified | ||||
|     executable containing the modified Library.  (It is understood | ||||
|     that the user who changes the contents of definitions files in the | ||||
|     Library will not necessarily be able to recompile the application | ||||
|     to use the modified definitions.) | ||||
| 
 | ||||
|     b) Accompany the work with a written offer, valid for at | ||||
|     least three years, to give the same user the materials | ||||
|     specified in Subsection 6a, above, for a charge no more | ||||
|     than the cost of performing this distribution. | ||||
| 
 | ||||
|     c) If distribution of the work is made by offering access to copy | ||||
|     from a designated place, offer equivalent access to copy the above | ||||
|     specified materials from the same place. | ||||
| 
 | ||||
|     d) Verify that the user has already received a copy of these | ||||
|     materials or that you have already sent this user a copy. | ||||
| 
 | ||||
|   For an executable, the required form of the "work that uses the | ||||
| Library" must include any data and utility programs needed for | ||||
| reproducing the executable from it.  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. | ||||
| 
 | ||||
|   It may happen that this requirement contradicts the license | ||||
| restrictions of other proprietary libraries that do not normally | ||||
| accompany the operating system.  Such a contradiction means you cannot | ||||
| use both them and the Library together in an executable that you | ||||
| distribute. | ||||
|  | ||||
|   7. You may place library facilities that are a work based on the | ||||
| Library side-by-side in a single library together with other library | ||||
| facilities not covered by this License, and distribute such a combined | ||||
| library, provided that the separate distribution of the work based on | ||||
| the Library and of the other library facilities is otherwise | ||||
| permitted, and provided that you do these two things: | ||||
| 
 | ||||
|     a) Accompany the combined library with a copy of the same work | ||||
|     based on the Library, uncombined with any other library | ||||
|     facilities.  This must be distributed under the terms of the | ||||
|     Sections above. | ||||
| 
 | ||||
|     b) Give prominent notice with the combined library of the fact | ||||
|     that part of it is a work based on the Library, and explaining | ||||
|     where to find the accompanying uncombined form of the same work. | ||||
| 
 | ||||
|   8. You may not copy, modify, sublicense, link with, or distribute | ||||
| the Library except as expressly provided under this License.  Any | ||||
| attempt otherwise to copy, modify, sublicense, link with, or | ||||
| distribute the Library 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. | ||||
| 
 | ||||
|   9. 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 Library or its derivative works.  These actions are | ||||
| prohibited by law if you do not accept this License.  Therefore, by | ||||
| modifying or distributing the Library (or any work based on the | ||||
| Library), you indicate your acceptance of this License to do so, and | ||||
| all its terms and conditions for copying, distributing or modifying | ||||
| the Library or works based on it. | ||||
| 
 | ||||
|   10. Each time you redistribute the Library (or any work based on the | ||||
| Library), the recipient automatically receives a license from the | ||||
| original licensor to copy, distribute, link with or modify the Library | ||||
| 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. | ||||
|  | ||||
|   11. 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 Library at all.  For example, if a patent | ||||
| license would not permit royalty-free redistribution of the Library 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 Library. | ||||
| 
 | ||||
| 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. | ||||
| 
 | ||||
|   12. If the distribution and/or use of the Library is restricted in | ||||
| certain countries either by patents or by copyrighted interfaces, the | ||||
| original copyright holder who places the Library 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. | ||||
| 
 | ||||
|   13. The Free Software Foundation may publish revised and/or new | ||||
| versions of the Library 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 Library | ||||
| 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 Library does not specify a | ||||
| license version number, you may choose any version ever published by | ||||
| the Free Software Foundation. | ||||
|  | ||||
|   14. If you wish to incorporate parts of the Library into other free | ||||
| programs whose distribution conditions are incompatible with these, | ||||
| 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 | ||||
| 
 | ||||
|   15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO | ||||
| WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. | ||||
| EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR | ||||
| OTHER PARTIES PROVIDE THE LIBRARY "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 | ||||
| LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME | ||||
| THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. | ||||
| 
 | ||||
|   16. 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 LIBRARY 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 | ||||
| LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), 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 Libraries | ||||
| 
 | ||||
|   If you develop a new library, and you want it to be of the greatest | ||||
| possible use to the public, we recommend making it free software that | ||||
| everyone can redistribute and change.  You can do so by permitting | ||||
| redistribution under these terms (or, alternatively, under the terms of the | ||||
| ordinary General Public License). | ||||
| 
 | ||||
|   To apply these terms, attach the following notices to the library.  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. | ||||
| 
 | ||||
|     <one line to give the library's name and a brief idea of what it does.> | ||||
|     Copyright (C) <year>  <name of author> | ||||
| 
 | ||||
|     This 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 of the License, or (at your option) any later version. | ||||
| 
 | ||||
|     This 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 this library; if not, write to the Free Software | ||||
|     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA | ||||
| 
 | ||||
| Also add information on how to contact you by electronic and paper mail. | ||||
| 
 | ||||
| You should also get your employer (if you work as a programmer) or your | ||||
| school, if any, to sign a "copyright disclaimer" for the library, if | ||||
| necessary.  Here is a sample; alter the names: | ||||
| 
 | ||||
|   Yoyodyne, Inc., hereby disclaims all copyright interest in the | ||||
|   library `Frob' (a library for tweaking knobs) written by James Random Hacker. | ||||
| 
 | ||||
|   <signature of Ty Coon>, 1 April 1990 | ||||
|   Ty Coon, President of Vice | ||||
| 
 | ||||
| That's all there is to it! | ||||
		Loading…
	
		Reference in a new issue
	
	 Leon Styhre
						Leon Styhre