Move Screenshot Code To ARM

This commit is contained in:
TheBrokenRail 2022-07-13 16:46:33 -04:00
parent 67002006f3
commit 69d3832815
18 changed files with 119 additions and 53 deletions

View File

@ -62,6 +62,7 @@ endif()
# Specify Installation Paths
set(MCPI_INSTALL_DIR "lib/${MCPI_VARIANT_NAME}")
set(MCPI_BIN_DIR "${MCPI_INSTALL_DIR}/bin")
set(MCPI_LEGAL_DIR "${MCPI_INSTALL_DIR}/legal") # For Software Licenses
set(MCPI_SDK_DIR "${MCPI_INSTALL_DIR}/sdk")
set(MCPI_SDK_LIB_DIR "${MCPI_SDK_DIR}/lib")
set(MCPI_SDK_INCLUDE_DIR "${MCPI_SDK_DIR}/include")

View File

@ -1,7 +1,9 @@
project(dependencies)
# LibPNG
add_subdirectory(libpng)
if(BUILD_ARM_COMPONENTS)
add_subdirectory(libpng)
endif()
# Minecraft: Pi Edition
if(BUILD_ARM_COMPONENTS AND NOT MCPI_OPEN_SOURCE_ONLY)
add_subdirectory(minecraft-pi)

View File

@ -16,7 +16,7 @@ set(PNG_SHARED TRUE CACHE BOOL "" FORCE)
# Download
set(ZLIB_LIBRARY zlibstatic)
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/zlib/src" "${CMAKE_CURRENT_BINARY_DIR}/zlib/src")
set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/zlib/src")
set(CMAKE_POLICY_DEFAULT_CMP0054 OLD) # Silence Warning
set(CMAKE_POLICY_DEFAULT_CMP0003 NEW) # Silence Warning
set(CMAKE_POLICY_DEFAULT_CMP0022 NEW) # Fix Error
@ -28,6 +28,9 @@ set(CMAKE_POLICY_DEFAULT_CMP0054 NEW) # Re-Enable New Behavior
set_target_properties(png12 PROPERTIES LINK_OPTIONS "LINKER:--version-script=${CMAKE_CURRENT_SOURCE_DIR}/libpng.vers") # Use Symbol Versioning
set_target_properties(png12 PROPERTIES DEBUG_POSTFIX "") # Fix LibPNG Suffix In Debug Mode
target_include_directories(png12 PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>")
foreach(zlib_include_dir IN ITEMS "${ZLIB_INCLUDE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/zlib/src")
target_include_directories(png12 PUBLIC "$<BUILD_INTERFACE:${zlib_include_dir}>")
endforeach()
# Ensure Build
add_custom_target(png12-build ALL DEPENDS png12)
@ -36,3 +39,6 @@ install(TARGETS png12 DESTINATION "${MCPI_LIB_DIR}")
if(BUILD_ARM_COMPONENTS)
install(TARGETS png12 zlibstatic EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# License
install(FILES src/LICENSE DESTINATION "${MCPI_LEGAL_DIR}/libpng")

View File

@ -11,3 +11,6 @@ add_subdirectory(src EXCLUDE_FROM_ALL)
# Ensure Build
add_custom_target(zlib-build ALL DEPENDS zlibstatic)
# License
install(FILES src/README DESTINATION "${MCPI_LEGAL_DIR}/zlib")

View File

@ -13,3 +13,6 @@ add_custom_target(zenity-build ALL DEPENDS zenity)
# Install
install(TARGETS zenity DESTINATION "${MCPI_BIN_DIR}")
# License
install(FILES src/COPYING DESTINATION "${MCPI_LEGAL_DIR}/zenity")

View File

@ -12,3 +12,6 @@ set_target_properties(patchelf PROPERTIES CXX_STANDARD 17)
# Install
install(TARGETS patchelf DESTINATION "${MCPI_BIN_DIR}")
# License
install(FILES src/COPYING DESTINATION "${MCPI_LEGAL_DIR}/patchelf")

View File

@ -7,7 +7,7 @@ add_subdirectory(dependencies)
add_subdirectory(gles)
# Configuration
set(CORE_SRC src/base.cpp src/media.c src/screenshot.c $<TARGET_OBJECTS:media-layer-extras>) # SDL Re-Implementation Using GLFW
set(CORE_SRC src/base.cpp src/media.c $<TARGET_OBJECTS:media-layer-extras>) # SDL Re-Implementation Using GLFW
if(NOT MCPI_HEADLESS_MODE)
list(APPEND CORE_SRC src/audio/api.cpp src/audio/engine.c src/audio/file.cpp)
else()
@ -28,5 +28,5 @@ if(NOT MCPI_HEADLESS_MODE)
# OpenAL
find_library(OPENAL_LIBRARY NAMES openal REQUIRED)
# Link
target_link_libraries(media-layer-core PRIVATE png12 PRIVATE "${OPENAL_LIBRARY}" PRIVATE m PRIVATE glfw)
target_link_libraries(media-layer-core PRIVATE "${OPENAL_LIBRARY}" PRIVATE m PRIVATE glfw)
endif()

View File

@ -26,3 +26,6 @@ install(TARGETS glfw DESTINATION "${MCPI_LIB_DIR}")
if(BUILD_ARM_COMPONENTS)
install(TARGETS glfw EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")
endif()
# License
install(FILES src/LICENSE.md DESTINATION "${MCPI_LEGAL_DIR}/glfw")

View File

@ -10,7 +10,6 @@ extern "C" {
void media_ensure_loaded();
void media_take_screenshot(char *home);
void media_toggle_fullscreen();
void media_swap_buffers();
void media_cleanup();

View File

@ -1160,9 +1160,13 @@ CALL(58, glIsEnabled, GLboolean, (GLenum cap)) {
static int get_glGetIntegerv_params_size(GLenum pname) {
switch (pname) {
case GL_TEXTURE_BINDING_2D:
case GL_PACK_ALIGNMENT:
case GL_UNPACK_ALIGNMENT: {
return 1;
}
case GL_VIEWPORT: {
return 4;
}
default: {
PROXY_ERR("Unsupported glGetIntegerv Property: %u", pname);
}
@ -1198,3 +1202,43 @@ CALL(61, glGetIntegerv, void, (GLenum pname, GLint *params)) {
safe_write((void *) params, sizeof (GLint) * size);
#endif
}
CALL(65, glReadPixels, void, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *data)) {
#if defined(MEDIA_LAYER_PROXY_SERVER)
// Get Texture Size
int size = get_texture_size(width, height, format, type);
// Lock Proxy
start_proxy_call();
// Arguments
write_int((uint32_t) x);
write_int((uint32_t) y);
write_int((uint32_t) width);
write_int((uint32_t) height);
write_int((uint32_t) format);
write_int((uint32_t) type);
// Get Return Value
safe_read((void *) data, size);
// Release Proxy
end_proxy_call();
#else
GLint x = (GLint) read_int();
GLint y = (GLint) read_int();
GLsizei width = (GLsizei) read_int();
GLsizei height = (GLsizei) read_int();
GLenum format = (GLenum) read_int();
GLenum type = (GLenum) read_int();
int size = get_texture_size(width, height, format, type);
void *pixels = malloc(size);
ALLOC_CHECK(pixels);
// Run
glReadPixels(x, y, width, height, format, type, pixels);
// Return Value
safe_write((void *) pixels, (size_t) size);
// Free
free(pixels);
#endif
}

View File

@ -56,6 +56,7 @@ void safe_read(void *buf, size_t len) {
// Read Remaining Data
size_t to_read_to_cache = 0;
while (to_read_to_cache < 1) {
CHECK_CONNECTION();
int bytes_available;
if (ioctl(get_connection_read(), FIONREAD, &bytes_available) == -1) {
bytes_available = 0;

View File

@ -176,25 +176,6 @@ CALL(6, SDL_ShowCursor, int, (int32_t toggle)) {
#endif
}
CALL(7, media_take_screenshot, void, (char *home)) {
#if defined(MEDIA_LAYER_PROXY_SERVER)
// Lock Proxy
start_proxy_call();
// Arguments
write_string(home);
// Release Proxy
end_proxy_call();
#else
char *home = read_string();
// Run
media_take_screenshot(home);
// Free
free(home);
#endif
}
CALL(8, media_swap_buffers, void, ()) {
#if defined(MEDIA_LAYER_PROXY_SERVER)
// Lock Proxy

View File

@ -16,6 +16,12 @@ install(DIRECTORY "include/" DESTINATION "${MCPI_SDK_INCLUDE_DIR}/mods")
add_library(compat SHARED src/compat/compat.c src/compat/egl.c src/compat/x11.c src/compat/bcm_host.c)
target_link_libraries(compat mods-headers reborn-patch media-layer-core)
if(NOT MCPI_HEADLESS_MODE)
target_link_libraries(compat screenshot)
endif()
if(NOT MCPI_SERVER_MODE)
target_link_libraries(compat input sign chat home dl)
endif()
add_library(readdir SHARED src/readdir/readdir.c)
@ -27,23 +33,23 @@ target_link_libraries(version mods-headers reborn-patch symbols)
add_library(chat SHARED src/chat/chat.cpp src/chat/ui.c)
target_link_libraries(chat mods-headers reborn-patch symbols feature)
if(NOT MCPI_SERVER_MODE)
target_link_libraries(chat input media-layer-core pthread)
endif()
add_library(creative SHARED src/creative/creative.cpp)
target_link_libraries(creative mods-headers reborn-patch symbols feature misc)
add_library(game-mode SHARED src/game-mode/game-mode.c src/game-mode/ui.cpp)
target_link_libraries(game-mode mods-headers reborn-patch symbols feature)
if(NOT MCPI_SERVER_MODE)
target_link_libraries(game-mode pthread media-layer-core)
endif()
if(MCPI_SERVER_MODE)
add_library(server SHARED src/server/server.cpp src/server/server_properties.cpp)
target_link_libraries(server mods-headers reborn-patch symbols feature home misc compat dl media-layer-core pthread)
else()
target_link_libraries(compat input sign chat home dl)
target_link_libraries(chat input media-layer-core pthread)
target_link_libraries(game-mode pthread media-layer-core)
add_library(multiplayer SHARED src/multiplayer/multiplayer.cpp)
target_link_libraries(multiplayer mods-headers reborn-patch symbols home feature)
@ -51,7 +57,10 @@ else()
target_link_libraries(sound mods-headers reborn-patch symbols feature override media-layer-core)
add_library(camera SHARED src/camera/camera.cpp)
target_link_libraries(camera mods-headers reborn-patch symbols media-layer-core feature home)
target_link_libraries(camera mods-headers reborn-patch symbols feature home)
if(NOT MCPI_HEADLESS_MODE)
target_link_libraries(camera screenshot)
endif()
add_library(input SHARED src/input/input.cpp src/input/bow.c src/input/attack.c src/input/toggle.c src/input/misc.c src/input/drop.cpp)
target_link_libraries(input mods-headers reborn-patch symbols creative feature misc media-layer-core)
@ -87,6 +96,11 @@ target_link_libraries(options mods-headers reborn-patch symbols feature home)
add_library(bucket SHARED src/bucket/bucket.cpp)
target_link_libraries(bucket mods-headers reborn-patch symbols feature misc)
if(NOT MCPI_HEADLESS_MODE)
add_library(screenshot SHARED src/screenshot/screenshot.c)
target_link_libraries(screenshot mods-headers reborn-util media-layer-core png12)
endif()
add_library(home SHARED src/home/home.c)
target_link_libraries(home mods-headers reborn-patch symbols)
@ -108,6 +122,9 @@ if(MCPI_SERVER_MODE)
else()
list(APPEND MODS_TO_INSTALL multiplayer sound camera input sign touch textures atlas benchmark)
endif()
if(NOT MCPI_HEADLESS_MODE)
list(APPEND MODS_TO_INSTALL screenshot)
endif()
install(TARGETS ${MODS_TO_INSTALL} DESTINATION "${MCPI_INSTALL_DIR}/mods")
# SDK
install(TARGETS ${MODS_TO_INSTALL} EXPORT sdk DESTINATION "${MCPI_SDK_LIB_DIR}")

View File

@ -0,0 +1,11 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
void screenshot_take(char *home);
#ifdef __cplusplus
}
#endif

View File

@ -1,14 +1,16 @@
#include <libreborn/libreborn.h>
#include <media-layer/core.h>
#include <symbols/minecraft.h>
#include <mods/feature/feature.h>
#include <mods/screenshot/screenshot.h>
#include <mods/home/home.h>
#include <mods/init/init.h>
// Take Screenshot Using TripodCamera
static void AppPlatform_linux_saveScreenshot_injection(__attribute__((unused)) unsigned char *app_platform, __attribute__((unused)) std::string const& path, __attribute__((unused)) int32_t width, __attribute__((unused)) int32_t height) {
media_take_screenshot(home_get());
#ifndef MCPI_HEADLESS_MODE
screenshot_take(home_get());
#endif
}
// Enable TripodCameraRenderer

View File

@ -3,6 +3,7 @@
#include <errno.h>
#include <mods/compat/compat.h>
#include <mods/screenshot/screenshot.h>
#include <mods/init/init.h>
#include <libreborn/libreborn.h>
@ -58,7 +59,9 @@ HOOK(SDL_PollEvent, int, (SDL_Event *event)) {
media_toggle_fullscreen();
handled = 1;
} else if (event->key.keysym.sym == SDLK_F2) {
media_take_screenshot(home_get());
#ifndef MCPI_HEADLESS_MODE
screenshot_take(home_get());
#endif
handled = 1;
} else if (event->key.keysym.sym == SDLK_F1) {
input_hide_gui();
@ -119,11 +122,7 @@ static void exit_handler(__attribute__((unused)) int data) {
}
void init_compat() {
// Install Signal Handlers
struct sigaction act_sigint;
memset((void *) &act_sigint, 0, sizeof (struct sigaction));
act_sigint.sa_flags = SA_RESTART;
act_sigint.sa_handler = &exit_handler;
sigaction(SIGINT, &act_sigint, NULL);
signal(SIGINT, SIG_IGN);
struct sigaction act_sigterm;
memset((void *) &act_sigterm, 0, sizeof (struct sigaction));
act_sigterm.sa_flags = SA_RESTART;

View File

@ -0,0 +1,2 @@
# ``screenshot`` Mod
This mod implements the core screenshot logic.

View File

@ -1,9 +1,3 @@
// Config Needs To Load First
#include <libreborn/libreborn.h>
// Screenshot Code Is Useless In Headless Mode
#ifndef MCPI_HEADLESS_MODE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
@ -14,8 +8,9 @@
#include <png.h>
#include <libreborn/libreborn.h>
#include <GLES/gl.h>
#include <media-layer/core.h>
#include <mods/screenshot/screenshot.h>
// Ensure Screenshots Folder Exists
static void ensure_screenshots_folder(char *screenshots) {
@ -99,7 +94,7 @@ static int save_png(const char *filename, unsigned char *pixels, int line_size,
// Return
return ret;
}
void media_take_screenshot(char *home) {
void screenshot_take(char *home) {
// Get Directory
char *screenshots = NULL;
safe_asprintf(&screenshots, "%s/screenshots", home);
@ -163,9 +158,3 @@ void media_take_screenshot(char *home) {
free(file);
free(screenshots);
}
#else
void media_take_screenshot() {
// NOP
}
#endif