(Android) Made PDF rendering work correctly using Poppler

This commit is contained in:
Leon Styhre 2023-12-11 18:38:11 +01:00
parent a4f5c82203
commit 854cef60cb
4 changed files with 38 additions and 15 deletions

View file

@ -221,7 +221,8 @@ if(APPLE AND CMAKE_CXX_COMPILER_VERSION GREATER_EQUAL 15.0.0)
endif()
if(ANDROID)
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -llog")
endif()
if(EMSCRIPTEN)
@ -442,7 +443,8 @@ set(COMMON_INCLUDE_DIRS ${CURL_INCLUDE_DIR}
${CMAKE_CURRENT_SOURCE_DIR}/external/lunasvg/include
${CMAKE_CURRENT_SOURCE_DIR}/external/rapidjson/include
${CMAKE_CURRENT_SOURCE_DIR}/external/rlottie/inc
${CMAKE_CURRENT_SOURCE_DIR}/es-core/src)
${CMAKE_CURRENT_SOURCE_DIR}/es-core/src
${CMAKE_CURRENT_SOURCE_DIR}/es-pdf-converter/src)
if(APPLE)
set(COMMON_INCLUDE_DIRS ${COMMON_INCLUDE_DIRS}
@ -572,11 +574,15 @@ elseif(ANDROID)
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libswscale.so
# Other dependencies.
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libcurl.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libfreeimage.a
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libcrypto.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libfreeimage.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libfreetype.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libgit2.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libjpeg.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libpoppler.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libpugixml.a
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libSDL2.so)
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libSDL2.so
${PROJECT_SOURCE_DIR}/android/libs/${ANDROID_CPU_ARCH}/libssl.so)
elseif(EMSCRIPTEN)
set(COMMON_LIBRARIES ${COMMON_LIBRARIES}
# FFmpeg core libraries.
@ -673,18 +679,14 @@ set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE)
# Add each component.
if(NOT ANDROID)
add_subdirectory(es-pdf-converter)
endif()
add_subdirectory(es-pdf-converter)
add_subdirectory(external)
add_subdirectory(es-core)
add_subdirectory(es-app)
if(NOT ANDROID)
# Make sure that es-pdf-convert is built first, and then that rlottie is built before es-core.
# Also set lottie2gif to not be built.
add_dependencies(lunasvg es-pdf-convert)
endif()
# Make sure that es-pdf-convert is built first, and then that rlottie is built before es-core.
# Also set lottie2gif to not be built.
add_dependencies(lunasvg es-pdf-convert)
add_dependencies(es-core rlottie)
set_target_properties(lottie2gif PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1)

View file

@ -134,9 +134,8 @@ elseif(WIN32)
set_target_properties(EmulationStation PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
elseif(ANDROID)
include_directories(${COMMON_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/src)
add_library(main SHARED ${ES_SOURCES} ${ES_HEADERS})
target_link_libraries(main ${COMMON_LIBRARIES} ${CMAKE_DL_LIBS} es-core)
set_target_properties(main PROPERTIES INSTALL_RPATH_USE_LINK_PATH TRUE)
add_library(main MODULE ${ES_SOURCES} ${ES_HEADERS})
target_link_libraries(main PRIVATE ${COMMON_LIBRARIES} ${CMAKE_DL_LIBS} es-core es-pdf-convert)
else()
include_directories(${COMMON_INCLUDE_DIRS} ${CMAKE_CURRENT_SOURCE_DIR}/src)
add_executable(emulationstation ${ES_SOURCES} ${ES_HEADERS})

View file

@ -20,6 +20,10 @@
#include <windows.h>
#endif
#if defined(__ANDROID__)
#include "ConvertPDF.h"
#endif
#define DEBUG_PDF_CONVERSION false
#define KEY_REPEAT_START_DELAY 600
@ -51,6 +55,7 @@ bool PDFViewer::startPDFViewer(FileData* game)
{
ViewController::getInstance()->pauseViewVideos();
#if !defined(__ANDROID__)
#if defined(_WIN64)
const std::string convertBinary {"/es-pdf-converter/es-pdf-convert.exe"};
#else
@ -67,6 +72,7 @@ bool PDFViewer::startPDFViewer(FileData* game)
ViewController::getInstance()->startViewVideos();
return false;
}
#endif // !__ANDROID__
mGame = game;
mManualPath = mGame->getManualPath();
@ -298,6 +304,8 @@ bool PDFViewer::getDocumentInfo()
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
#elif defined(__ANDROID__)
ConvertPDF::processFile(mManualPath, "-fileinfo", 0, 0, 0, commandOutput);
#else
FILE* commandPipe;
std::array<char, 512> buffer {};
@ -439,6 +447,13 @@ void PDFViewer::convertPage(int pageNum)
CloseHandle(childStdoutRead);
WaitForSingleObject(pi.hThread, INFINITE);
WaitForSingleObject(pi.hProcess, INFINITE);
#elif (__ANDROID__)
ConvertPDF::processFile(mManualPath, "-convert", pageNum,
static_cast<int>(mPages[pageNum].width),
static_cast<int>(mPages[pageNum].height), imageData);
mPages[pageNum].imageData.insert(mPages[pageNum].imageData.end(),
std::make_move_iterator(imageData.begin()),
std::make_move_iterator(imageData.end()));
#else
FILE* commandPipe;
std::array<char, 512> buffer {};
@ -461,6 +476,8 @@ void PDFViewer::convertPage(int pageNum)
#if defined(_WIN64)
if (!processReturnValue || (static_cast<int>(imageDataSize) <
mPages[pageNum].width * mPages[pageNum].height * 4)) {
#elif defined(__ANDROID__)
if (static_cast<int>(imageDataSize) < mPages[pageNum].width * mPages[pageNum].height * 4) {
#else
if (returnValue != 0 || (static_cast<int>(imageDataSize) <
mPages[pageNum].width * mPages[pageNum].height * 4)) {

View file

@ -169,6 +169,11 @@ set(CORE_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/utils/TimeUtil.cpp
)
if(ANDROID)
set(CORE_HEADERS ${CORE_HEADERS} ${CMAKE_CURRENT_SOURCE_DIR}/src/utils/PlatformUtilAndroid.h)
set(CORE_SOURCES ${CORE_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/src/utils/PlatformUtilAndroid.cpp)
endif()
#---------------------------------------------------------------------------------------------------
# Miscellaneous configuration.