[Build] Move non-core common code to `components/`

* Create multiple components library. These depend on the core code and
  are used by multiple frontends.
* Clean up the filters declaration by moving them to a common header in
  `components/filters/filters.h`.
* Clean up the include guards and include orders.
* Fix the modified paths in `src/debian/copyright` to match their new
  location.
This commit is contained in:
Fabrice de Gans 2024-03-16 16:45:13 -07:00 committed by Fabrice de Gans
parent 047bd935ea
commit 000c7f854c
77 changed files with 742 additions and 776 deletions

View File

@ -238,19 +238,14 @@ if(CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg")
endif() endif()
endif() endif()
set(SDL2_TARGETS SDL2::SDL2 ${SDL2_LIBRARY_TEMP}) set(VBAM_SDL2_LIBS SDL2::SDL2 ${SDL2_LIBRARY_TEMP})
# set the standard libraries all ports use # set the standard libraries all ports use
set( set(
VBAMCORE_LIBS VBAMCORE_LIBS
vbamcore vbam-core
vbam-core-apu ${VBAM_SDL2_LIBS}
vbam-core-base
vbam-core-emulator
vbam-fex
${SDL2_TARGETS}
${OPENGL_LIBRARIES} ${OPENGL_LIBRARIES}
${ZLIB_LIBRARY}
) )
set(VBAM_GENERATED_DIR ${CMAKE_BINARY_DIR}/generated) set(VBAM_GENERATED_DIR ${CMAKE_BINARY_DIR}/generated)
@ -261,7 +256,6 @@ include_directories(
${VBAM_GENERATED_DIR} ${VBAM_GENERATED_DIR}
) )
if(ENABLE_FFMPEG) if(ENABLE_FFMPEG)
if(NOT FFMPEG_LIBRARIES) if(NOT FFMPEG_LIBRARIES)
message(FATAL_ERROR "ENABLE_FFMPEG was specified, but required versions of ffmpeg libraries cannot be found!") message(FATAL_ERROR "ENABLE_FFMPEG was specified, but required versions of ffmpeg libraries cannot be found!")
@ -304,16 +298,6 @@ add_compile_definitions(HAVE_NETINET_IN_H HAVE_ARPA_INET_H HAVE_ZLIB_H FINAL_VER
add_compile_definitions(PKGDATADIR="${CMAKE_INSTALL_FULL_DATADIR}/vbam") add_compile_definitions(PKGDATADIR="${CMAKE_INSTALL_FULL_DATADIR}/vbam")
add_compile_definitions(__STDC_FORMAT_MACROS) add_compile_definitions(__STDC_FORMAT_MACROS)
# For C++, default to nonstd::optional and nonstd::variant for now due to mac
# build issues.
if(APPLE)
add_compile_definitions(optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_NONSTD)
add_compile_definitions(variant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD)
else()
add_compile_definitions(optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_STD)
add_compile_definitions(variant_CONFIG_SELECT_VARIANT=variant_VARIANT_STD)
endif()
if(ENABLE_LINK) if(ENABLE_LINK)
# IPC linking code needs sem_timedwait which can be either in librt or pthreads # IPC linking code needs sem_timedwait which can be either in librt or pthreads
if(NOT WIN32) if(NOT WIN32)
@ -364,54 +348,29 @@ if(ENABLE_NLS)
find_library(LIBCHARSET_LIB NAMES libcharset charset) find_library(LIBCHARSET_LIB NAMES libcharset charset)
if(LIBINTL_LIB) if(LIBINTL_LIB)
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIB}) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBINTL_LIB})
list(APPEND VBAMCORE_LIBS ${LIBINTL_LIB}) list(APPEND NLS_LIBS ${LIBINTL_LIB})
endif() endif()
if(LIBICONV_LIB) if(LIBICONV_LIB)
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_LIB}) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBICONV_LIB})
list(APPEND VBAMCORE_LIBS ${LIBICONV_LIB}) list(APPEND NLS_LIBS ${LIBICONV_LIB})
endif() endif()
if(LIBCHARSET_LIB) if(LIBCHARSET_LIB)
list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_LIB}) list(APPEND CMAKE_REQUIRED_LIBRARIES ${LIBCHARSET_LIB})
list(APPEND VBAMCORE_LIBS ${LIBCHARSET_LIB}) list(APPEND NLS_LIBS ${LIBCHARSET_LIB})
endif() endif()
include(CheckFunctionExists) include(CheckFunctionExists)
check_function_exists(gettext GETTEXT_FN) check_function_exists(gettext GETTEXT_FN)
if(NOT (LIBINTL_INC OR GETTEXT_FN)) if(NOT (LIBINTL_INC OR GETTEXT_FN))
message(FATAL_ERROR "NLS requires libintl/gettext") message(FATAL_ERROR "NLS requires libintl/gettext")
endif() endif()
include_directories(${LIBINTL_INC})
endif() endif()
endif() endif()
if(NOT TRANSLATIONS_ONLY) if(NOT TRANSLATIONS_ONLY)
add_subdirectory(third_party/include/nonstd)
add_subdirectory(third_party/include/stb) add_subdirectory(third_party/include/stb)
add_subdirectory(src/core) add_subdirectory(src/core)
endif() add_subdirectory(src/components)
set(
SRC_MAIN
src/Util_common.cpp
src/Util_desktop.cpp
src/common/SoundSDL.cpp
)
if(MSVC)
set(SRC_MAIN ${SRC_MAIN} "dependencies/msvc/getopt.c")
endif()
set(
HDR_MAIN
src/Util.h
src/common/SoundSDL.h
)
if(MSVC)
set(HDR_MAIN ${HDR_MAIN} "dependencies/msvc/getopt.h")
endif()
if(ENABLE_FFMPEG)
set(SRC_MAIN ${SRC_MAIN} src/common/ffmpeg.cpp)
set(HDR_MAIN ${HDR_MAIN} src/common/ffmpeg.h)
endif() endif()
set( set(
@ -425,8 +384,10 @@ set(
src/sdl/iniparser.c src/sdl/iniparser.c
src/sdl/inputSDL.cpp src/sdl/inputSDL.cpp
src/sdl/SDL.cpp src/sdl/SDL.cpp
src/sdl/text.cpp
) )
if(MSVC)
list(APPEND SRC_SDL "dependencies/msvc/getopt.c")
endif()
set( set(
HDR_SDL HDR_SDL
@ -437,89 +398,9 @@ set(
src/sdl/filters.h src/sdl/filters.h
src/sdl/iniparser.h src/sdl/iniparser.h
src/sdl/inputSDL.h src/sdl/inputSDL.h
src/sdl/text.h
) )
if(MSVC)
set( list(APPEND HDR_SDL "dependencies/msvc/getopt.h")
SRC_FILTERS
src/filters/2xSaI.cpp
src/filters/admame.cpp
src/filters/bilinear.cpp
src/filters/hq2x.cpp
src/filters/interframe.cpp
src/filters/pixel.cpp
src/filters/scanline.cpp
src/filters/simpleFilter.cpp
src/filters/xbrzfilter.cpp
src/filters/xBRZ/xbrz.cpp
)
set(
HDR_FILTERS
src/filters/hq2x.h
src/filters/interp.h
src/filters/lq2x.h
src/filters/xBRZ/xbrz_config.h
src/filters/xBRZ/xbrz.h
src/filters/xBRZ/xbrz_tools.h
)
set(
SRC_HQ_C
src/filters/hq/c/hq_implementation.cpp
)
set(
HDR_HQ_C
src/filters/hq/c/hq3x_pattern.h
src/filters/hq/c/hq4x_pattern.h
src/filters/hq/c/hq_base.h
src/filters/hq/c/hq_shared.h
)
set(
SRC_HQ_ASM
src/filters/hq/asm/hq3x_16.asm
src/filters/hq/asm/hq3x_32.asm
src/filters/hq/asm/hq4x_16.asm
src/filters/hq/asm/hq4x_32.asm
src/filters/hq/asm/hq3x32.cpp
)
if(ENABLE_ASM_SCALERS)
set(SRC_FILTERS ${SRC_FILTERS} ${SRC_HQ_ASM})
if(ENABLE_MMX)
set(SRC_FILTERS ${SRC_FILTERS} src/filters/2xSaImmx.asm)
endif()
else()
set(SRC_FILTERS ${SRC_FILTERS} ${SRC_HQ_C})
set(HDR_FILTERS ${HDR_FILTERS} ${HDR_HQ_C})
add_compile_definitions(NO_ASM)
endif()
include_directories(
${ZLIB_INCLUDE_DIR}
third_party/include
)
if(ENABLE_FFMPEG)
include_directories(
${FFMPEG_INCLUDE_DIRS}
)
endif()
if(NOT TRANSLATIONS_ONLY)
add_library(
vbamcore
STATIC
${PROJECT_SRCS}
${SRC_MAIN}
${HDR_MAIN}
${SRC_FILTERS}
${HDR_FILTERS}
)
target_include_directories(vbamcore PUBLIC ${SDL2_INCLUDE_DIRS})
endif() endif()
if((NOT TRANSLATIONS_ONLY) AND ENABLE_SDL) if((NOT TRANSLATIONS_ONLY) AND ENABLE_SDL)
@ -543,8 +424,13 @@ if((NOT TRANSLATIONS_ONLY) AND ENABLE_SDL)
set(LIRC_CLIENT_LIBRARY lirc_client) set(LIRC_CLIENT_LIBRARY lirc_client)
endif() endif()
target_link_libraries( target_link_libraries(vbam
vbam vbam-components-audio-sdl
vbam-components-draw-text
vbam-components-filters
vbam-components-filters-agb
vbam-components-filters-interframe
vbam-components-user-config
${VBAMCORE_LIBS} ${VBAMCORE_LIBS}
${WIN32_LIBRARIES} ${WIN32_LIBRARIES}
${LIRC_CLIENT_LIBRARY} ${LIRC_CLIENT_LIBRARY}

View File

@ -10,7 +10,6 @@ Known preprocessor switches:
- FINAL_VERSION: Defined for release versions, disables additional GBA logging and completely disables GB logging. Increases the amount of CPU cycles being emulated in one go. - FINAL_VERSION: Defined for release versions, disables additional GBA logging and completely disables GB logging. Increases the amount of CPU cycles being emulated in one go.
- VBAM_ENABLE_DEBUGGER: Enable remote debugging support - VBAM_ENABLE_DEBUGGER: Enable remote debugging support
- MMX: Enable MMX instruction set - MMX: Enable MMX instruction set
- NO_ASM: Use C++ version of hq3x/4x filters
- RGB555: Use 16bit colors with 5bit green instead of 6bit green in hq3x/4x filters (C++ version) - RGB555: Use 16bit colors with 5bit green instead of 6bit green in hq3x/4x filters (C++ version)
- NO_OGL: Exclude OpenGL code - NO_OGL: Exclude OpenGL code
- NO_D3D: Exclude Direct3D code - NO_D3D: Exclude Direct3D code

View File

@ -1,18 +0,0 @@
#ifndef UTIL_H
#define UTIL_H
#include <string>
#ifdef _WIN32
#define FILE_SEP '\\'
#else // MacOS, Unix
#define FILE_SEP '/'
#endif
std::string get_xdg_user_config_home();
std::string get_xdg_user_data_home();
void utilGBAFindSave(const int);
void utilUpdateSystemColorMaps(bool lcd = false);
#endif // UTIL_H

View File

@ -1,94 +0,0 @@
#include "Util.h"
#include <cstring>
#include "core/base/port.h"
#include "core/base/system.h"
#include "core/gba/gbaFilter.h"
#include "core/gba/gbaFlash.h"
#include "core/gba/gbaGlobals.h"
#include "core/gba/gbaRtc.h"
#if defined(_MSC_VER)
#define strcasecmp _stricmp
#endif // defined(_MSC_VER)
void utilUpdateSystemColorMaps(bool lcd) {
switch (systemColorDepth) {
case 16: {
for (int i = 0; i < 0x10000; i++) {
systemColorMap16[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal(systemColorMap16, 0x10000);
} break;
case 24:
case 32: {
for (int i = 0; i < 0x10000; i++) {
systemColorMap32[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal32(systemColorMap32, 0x10000);
} break;
}
}
void utilGBAFindSave(const int size) {
uint32_t* p = (uint32_t*)&g_rom[0];
uint32_t* end = (uint32_t*)(&g_rom[0] + size);
int detectedSaveType = 0;
int flashSize = 0x10000;
bool rtcFound = false;
while (p < end) {
uint32_t d = READ32LE(p);
if (d == 0x52504545) {
if (memcmp(p, "EEPROM_", 7) == 0) {
if (detectedSaveType == 0 || detectedSaveType == 4)
detectedSaveType = 1;
}
} else if (d == 0x4D415253) {
if (memcmp(p, "SRAM_", 5) == 0) {
if (detectedSaveType == 0 || detectedSaveType == 1 || detectedSaveType == 4)
detectedSaveType = 2;
}
} else if (d == 0x53414C46) {
if (memcmp(p, "FLASH1M_", 8) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 3;
flashSize = 0x20000;
}
} else if (memcmp(p, "FLASH512_", 9) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 3;
flashSize = 0x10000;
}
} else if (memcmp(p, "FLASH", 5) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 4;
flashSize = 0x10000;
}
}
} else if (d == 0x52494953) {
if (memcmp(p, "SIIRTC_V", 8) == 0)
rtcFound = true;
}
p++;
}
// if no matches found, then set it to NONE
if (detectedSaveType == 0) {
detectedSaveType = 5;
}
if (detectedSaveType == 4) {
detectedSaveType = 3;
}
rtcEnable(rtcFound);
rtcEnableRumble(!rtcFound);
coreOptions.saveType = detectedSaveType;
flashSetSize(flashSize);
}

View File

@ -0,0 +1,7 @@
add_subdirectory(audio_sdl)
add_subdirectory(av_recording)
add_subdirectory(draw_text)
add_subdirectory(filters)
add_subdirectory(filters_agb)
add_subdirectory(filters_interframe)
add_subdirectory(user_config)

View File

@ -0,0 +1,14 @@
add_library(vbam-components-audio-sdl OBJECT)
target_sources(vbam-components-audio-sdl
PRIVATE audio_sdl.cpp
PUBLIC audio_sdl.h
)
target_include_directories(vbam-components-audio-sdl
PUBLIC ${SDL2_INCLUDE_DIRS}
)
target_link_libraries(vbam-components-audio-sdl
PUBLIC vbam-core-base ${VBAM_SDL2_LIBS}
)

View File

@ -15,10 +15,13 @@
// along with this program; if not, write to the Free Software Foundation, // along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#include "components/audio_sdl/audio_sdl.h"
#include <cmath> #include <cmath>
#include <iostream> #include <iostream>
#include <SDL_events.h> #include <SDL_events.h>
#include "SoundSDL.h"
#include "core/gba/gbaGlobals.h" #include "core/gba/gbaGlobals.h"
#include "core/gba/gbaSound.h" #include "core/gba/gbaSound.h"

View File

@ -15,8 +15,8 @@
// along with this program; if not, write to the Free Software Foundation, // along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifndef __VBA_SOUND_SDL_H__ #ifndef VBAM_COMPONENTS_AUDIO_SDL_AUDIO_SDL_H_
#define __VBA_SOUND_SDL_H__ #define VBAM_COMPONENTS_AUDIO_SDL_AUDIO_SDL_H_
#include <SDL.h> #include <SDL.h>
@ -60,4 +60,4 @@ private:
static const double buftime; static const double buftime;
}; };
#endif // __VBA_SOUND_SDL_H__ #endif // VBAM_COMPONENTS_AUDIO_SDL_AUDIO_SDL_H_

View File

@ -0,0 +1,18 @@
if(NOT ENABLE_FFMPEG)
return()
endif()
add_library(vbam-components-av-recording OBJECT)
target_sources(vbam-components-av-recording
PRIVATE av_recording.cpp
PUBLIC av_recording.h
)
target_include_directories(vbam-components-av-recording
PUBLIC ${FFMPEG_INCLUDE_DIRS}
)
target_link_libraries(vbam-components-av-recording
PUBLIC ${FFMPEG_LIBRARIES}
)

View File

@ -1,4 +1,4 @@
#include "ffmpeg.h" #include "components/av_recording/av_recording.h"
#define STREAM_FRAME_RATE 60 #define STREAM_FRAME_RATE 60
#define STREAM_PIXEL_FORMAT AV_PIX_FMT_YUV420P #define STREAM_PIXEL_FORMAT AV_PIX_FMT_YUV420P

View File

@ -1,12 +1,12 @@
#ifndef WX_FFMPEG_H #ifndef VBAM_COMPONENTS_AV_RECORDING_AV_RECORDING_H_
#define WX_FFMPEG_H #define VBAM_COMPONENTS_AV_RECORDING_AV_RECORDING_H_
// simplified interface for recording audio and/or video from emulator // simplified interface for recording audio and/or video from emulator
extern "C" { extern "C" {
/* From: http://redino.net/blog/2013/12/uint64_c-defined-including-libavformatavformat-h-vs-2008/ */ /* From: http://redino.net/blog/2013/12/uint64_c-defined-including-libavformatavformat-h-vs-2008/ */
#include <stdint.h> #include <cstdint>
#ifndef INT64_C #ifndef INT64_C
#define INT64_C(c) (c ## LL) #define INT64_C(c) (c ## LL)
@ -29,7 +29,6 @@ extern "C" {
} }
#include <vector> #include <vector>
#include <string>
namespace recording { namespace recording {
@ -127,4 +126,4 @@ class MediaRecorder
} }
#endif /* WX_FFMPEG_H */ #endif // VBAM_COMPONENTS_AV_RECORDING_AV_RECORDING_H_

View File

@ -0,0 +1,10 @@
add_library(vbam-components-draw-text OBJECT)
target_sources(vbam-components-draw-text
PRIVATE draw_text.cpp
PUBLIC draw_text.h
)
target_link_libraries(vbam-components-draw-text
PRIVATE vbam-core-base
)

View File

@ -20,6 +20,8 @@
/* Code originally from fceu/drawing.h file, adapted by Forgotten /* Code originally from fceu/drawing.h file, adapted by Forgotten
*/ */
#include "components/draw_text/draw_text.h"
#include "core/base/system.h" #include "core/base/system.h"
extern int RGB_LOW_BITS_MASK; extern int RGB_LOW_BITS_MASK;

View File

@ -17,4 +17,11 @@
// along with this program; if not, write to the Free Software Foundation, // along with this program; if not, write to the Free Software Foundation,
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#ifndef VBAM_COMPONENTS_DRAW_TEXT_DRAW_TEXT_H_
#define VBAM_COMPONENTS_DRAW_TEXT_DRAW_TEXT_H_
#include <cstdint>
extern void drawText(uint8_t*, int, int, int, const char*, bool); extern void drawText(uint8_t*, int, int, int, const char*, bool);
#endif // VBAM_COMPONENTS_DRAW_TEXT_DRAW_TEXT_H_

View File

@ -0,0 +1,47 @@
add_library(vbam-components-filters OBJECT)
target_sources(vbam-components-filters
PRIVATE
internal/2xSaI.cpp
internal/admame.cpp
internal/bilinear.cpp
internal/hq2x.cpp
internal/hq2x.h
internal/interp.h
internal/lq2x.h
internal/pixel.cpp
internal/scanline.cpp
internal/simpleFilter.cpp
internal/xBRZ/xbrz.cpp
internal/xBRZ/xbrz.h
internal/xBRZ/xbrz_config.h
internal/xBRZ/xbrz_tools.h
internal/xbrzfilter.cpp
PUBLIC
filters.h
)
if(ENABLE_ASM_SCALERS)
target_sources(vbam-components-filters
PRIVATE
internal/hq/asm/hq3x_16.asm
internal/hq/asm/hq3x_32.asm
internal/hq/asm/hq4x_16.asm
internal/hq/asm/hq4x_32.asm
internal/hq/asm/hq3x32.cpp
internal/hq/asm/macros.mac
)
if(ENABLE_MMX)
set(SRC_FILTERS ${SRC_FILTERS} internal/2xSaImmx.asm)
endif()
else()
target_sources(vbam-components-filters
PRIVATE
internal/hq/c/hq3x_pattern.h
internal/hq/c/hq4x_pattern.h
internal/hq/c/hq_base.h
internal/hq/c/hq_implementation.cpp
internal/hq/c/hq_shared.h
)
endif()

View File

@ -1,14 +1,12 @@
#ifndef FILTERS_H #ifndef VBAM_COMPONENTS_FILTERS_FILTERS_H_
#define FILTERS_H #define VBAM_COMPONENTS_FILTERS_FILTERS_H_
#include <cstdint>
// FIXME: these should be in a system header included by all users and all
// files which define these functions
// most 16-bit filters require space in src rounded up to uint32_t // most 16-bit filters require space in src rounded up to uint32_t
// those that take delta take 1 src line of pixels, rounded up to uint32_t size // those that take delta take 1 src line of pixels, rounded up to uint32_t size
// initial value appears to be all-0xff // initial value appears to be all-0xff
#include "../filters/interframe.hpp"
void Pixelate32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h); void Pixelate32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h);
void Pixelate(uint8_t* src, uint32_t spitch, uint8_t* delta, uint8_t* dst, uint32_t dstp, int w, int h); void Pixelate(uint8_t* src, uint32_t spitch, uint8_t* delta, uint8_t* dst, uint32_t dstp, int w, int h);
// next 3*2 use Init_2xSaI(555|565) and do not take into account // next 3*2 use Init_2xSaI(555|565) and do not take into account
@ -71,4 +69,4 @@ void xbrz4x32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t ds
void xbrz5x32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h); void xbrz5x32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h);
void xbrz6x32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h); void xbrz6x32(uint8_t* src, uint32_t spitch, uint8_t*, uint8_t* dst, uint32_t dstp, int w, int h);
#endif /* FILTERS_H */ #endif // VBAM_COMPONENTS_FILTERS_FILTERS_H_

View File

@ -28,12 +28,10 @@
* do so, delete this exception statement from your version. * do so, delete this exception statement from your version.
*/ */
#ifndef __INTERP_H #ifndef VBAM_COMPONENTS_FILTERS_INTERNAL_INTERP_H
#define __INTERP_H #define VBAM_COMPONENTS_FILTERS_INTERNAL_INTERP_H
#define __STDC_CONSTANT_MACROS #include <cstdint>
#include <stdint.h>
typedef uint16_t interp_uint16; typedef uint16_t interp_uint16;
typedef uint32_t interp_uint32; typedef uint32_t interp_uint32;
@ -342,4 +340,4 @@ static void interp_set(unsigned bits_per_pixel)
} }
} }
#endif #endif // VBAM_COMPONENTS_FILTERS_INTERNAL_INTERP_H

View File

@ -0,0 +1,6 @@
add_library(vbam-components-filters-agb OBJECT)
target_sources(vbam-components-filters-agb
PRIVATE filters_agb.cpp
PUBLIC filters_agb.h
)

View File

@ -1,4 +1,4 @@
#include "core/gba/gbaFilter.h" #include "components/filters_agb/filters_agb.h"
extern int systemColorDepth; extern int systemColorDepth;
extern int systemRedShift; extern int systemRedShift;
@ -25,6 +25,30 @@ inline void swap(short& a, short& b)
b = temp; b = temp;
} }
void gbafilter_update_colors(bool lcd) {
switch (systemColorDepth) {
case 16: {
for (int i = 0; i < 0x10000; i++) {
systemColorMap16[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal(systemColorMap16, 0x10000);
} break;
case 24:
case 32: {
for (int i = 0; i < 0x10000; i++) {
systemColorMap32[i] = ((i & 0x1f) << systemRedShift) |
(((i & 0x3e0) >> 5) << systemGreenShift) |
(((i & 0x7c00) >> 10) << systemBlueShift);
}
if (lcd)
gbafilter_pal32(systemColorMap32, 0x10000);
} break;
}
}
void gbafilter_pal(uint16_t* buf, int count) void gbafilter_pal(uint16_t* buf, int count)
{ {
short temp[3 * 3], s; short temp[3 * 3], s;

View File

@ -0,0 +1,11 @@
#ifndef VBAM_COMPONENTS_FILTERS_AGB_FILTERS_AGB_H_
#define VBAM_COMPONENTS_FILTERS_AGB_FILTERS_AGB_H_
#include <cstdint>
void gbafilter_update_colors(bool lcd = false);
void gbafilter_pal(uint16_t* buf, int count);
void gbafilter_pal32(uint32_t* buf, int count);
void gbafilter_pad(uint8_t* buf, int count);
#endif // VBAM_COMPONENTS_FILTERS_AGB_FILTERS_AGB_H_

View File

@ -0,0 +1,6 @@
add_library(vbam-components-filters-interframe OBJECT)
target_sources(vbam-components-filters-interframe
PRIVATE interframe.cpp
PUBLIC interframe.h
)

View File

@ -1,4 +1,4 @@
#include "interframe.hpp" #include "components/filters_interframe/interframe.h"
#include <cstdlib> #include <cstdlib>

View File

@ -1,7 +1,7 @@
/// Interframe blending filters /// Interframe blending filters
#ifndef INTERFRAME_HPP #ifndef VBAM_COMPONENTS_FILTERS_INTERFRAME_INTERFRAME_H_
#define INTERFRAME_HPP #define VBAM_COMPONENTS_FILTERS_INTERFRAME_INTERFRAME_H_
#include <cstdint> #include <cstdint>
@ -30,4 +30,5 @@ void SmartIB(uint8_t *srcPtr, uint32_t srcPitch, int width, int height);
void SmartIB32(uint8_t *srcPtr, uint32_t srcPitch, int width, int height); void SmartIB32(uint8_t *srcPtr, uint32_t srcPitch, int width, int height);
void MotionBlurIB(uint8_t *srcPtr, uint32_t srcPitch, int width, int height); void MotionBlurIB(uint8_t *srcPtr, uint32_t srcPitch, int width, int height);
void MotionBlurIB32(uint8_t *srcPtr, uint32_t srcPitch, int width, int height); void MotionBlurIB32(uint8_t *srcPtr, uint32_t srcPitch, int width, int height);
#endif //INTERFRAME_HPP
#endif //VBAM_COMPONENTS_FILTERS_INTERFRAME_INTERFRAME_H_

View File

@ -0,0 +1,6 @@
add_library(vbam-components-user-config OBJECT)
target_sources(vbam-components-user-config
PRIVATE user_config.cpp
PUBLIC user_config.h
)

View File

@ -1,4 +1,4 @@
#include "Util.h" #include "components/user_config/user_config.h"
#include <cstdlib> #include <cstdlib>
@ -26,7 +26,7 @@ std::string get_xdg_user_config_home()
path = xdg_var; path = xdg_var;
} }
#endif #endif
return path + FILE_SEP; return path + kFileSep;
} }
// Get user-specific data dir manually. // Get user-specific data dir manually.
@ -53,6 +53,6 @@ std::string get_xdg_user_data_home()
path = xdg_var; path = xdg_var;
} }
#endif #endif
return path + FILE_SEP; return path + kFileSep;
} }

View File

@ -0,0 +1,15 @@
#ifndef VBAM_COMPONENTS_USER_CONFIG_USER_CONFIG_H_
#define VBAM_COMPONENTS_USER_CONFIG_USER_CONFIG_H_
#include <string>
#if defined(_WIN32)
static constexpr char kFileSep = '\\';
#else // !defined(_WIN32)
static constexpr char kFileSep = '/';
#endif // defined(_WIN32)
std::string get_xdg_user_config_home();
std::string get_xdg_user_data_home();
#endif // VBAM_COMPONENTS_USER_CONFIG_USER_CONFIG_H_

View File

@ -2,13 +2,13 @@ add_subdirectory(apu)
add_subdirectory(base) add_subdirectory(base)
add_subdirectory(fex) add_subdirectory(fex)
# The vbam-core-emulator target contains both the Game Boy and Game Boy Advance # The vbam-core target contains both the Game Boy and Game Boy Advance
# emulators. These should be broken down into 2 separate targets. The issue lies # emulators. These should be broken down into 2 separate targets. The issue lies
# with the Link and Sound emulation, which are tangled together between the two # with the Link and Sound emulation, which are tangled together between the two
# systems. # systems.
add_library(vbam-core-emulator OBJECT) add_library(vbam-core STATIC)
target_sources(vbam-core-emulator target_sources(vbam-core
PRIVATE PRIVATE
# Game Boy # Game Boy
gb/internal/gbCodes.h gb/internal/gbCodes.h
@ -39,7 +39,6 @@ target_sources(vbam-core-emulator
gba/gbaCheatSearch.cpp gba/gbaCheatSearch.cpp
gba/gbaEeprom.cpp gba/gbaEeprom.cpp
gba/gbaElf.cpp gba/gbaElf.cpp
gba/gbaFilter.cpp
gba/gbaFlash.cpp gba/gbaFlash.cpp
gba/gbaGfx.cpp gba/gbaGfx.cpp
gba/gbaGlobals.cpp gba/gbaGlobals.cpp
@ -80,7 +79,6 @@ target_sources(vbam-core-emulator
gba/gbaCpuArmDis.h gba/gbaCpuArmDis.h
gba/gbaEeprom.h gba/gbaEeprom.h
gba/gbaElf.h gba/gbaElf.h
gba/gbaFilter.h
gba/gbaFlash.h gba/gbaFlash.h
gba/gbaGfx.h gba/gbaGfx.h
gba/gbaGlobals.h gba/gbaGlobals.h
@ -90,17 +88,17 @@ target_sources(vbam-core-emulator
gba/gbaSound.h gba/gbaSound.h
) )
target_include_directories(vbam-core-base target_include_directories(vbam-core
PUBLIC ${ZLIB_INCLUDE_DIR} PUBLIC ${ZLIB_INCLUDE_DIR}
) )
target_link_libraries(vbam-core-emulator target_link_libraries(vbam-core
PRIVATE vbam-core-apu PRIVATE vbam-core-apu vbam-fex
PUBLIC vbam-core-base ${ZLIB_LIBRARY} PUBLIC vbam-core-base ${ZLIB_LIBRARY}
) )
if(ENABLE_DEBUGGER) if(ENABLE_DEBUGGER)
target_sources(vbam-core-emulator target_sources(vbam-core
PRIVATE PRIVATE
gba/gbaRemote.cpp gba/gbaRemote.cpp
gba/internal/gbaBreakpoint.cpp gba/internal/gbaBreakpoint.cpp
@ -112,7 +110,7 @@ if(ENABLE_DEBUGGER)
endif() endif()
if(ENABLE_LINK) if(ENABLE_LINK)
target_sources(vbam-core-emulator target_sources(vbam-core
PRIVATE PRIVATE
gba/gbaLink.cpp gba/gbaLink.cpp
gba/internal/gbaSockClient.cpp gba/internal/gbaSockClient.cpp
@ -122,10 +120,18 @@ if(ENABLE_LINK)
gba/gbaLink.h gba/gbaLink.h
) )
target_include_directories(vbam-core-emulator target_include_directories(vbam-core
PRIVATE ${SFML_INCLUDE_DIR}) PRIVATE ${SFML_INCLUDE_DIR})
target_link_libraries(vbam-core-emulator target_link_libraries(vbam-core
PRIVATE ${SFML_LIBRARIES}) PRIVATE ${SFML_LIBRARIES})
endif()
if(ENABLE_NLS)
# Add libintl.h
target_include_directories(vbam-core
PRIVATE ${LIBINTL_INC})
target_link_libraries(vbam-core
PRIVATE ${NLS_LIBS})
endif()
endif()

View File

@ -56,6 +56,6 @@ target_include_directories(vbam-core-base
) )
target_link_libraries(vbam-core-base target_link_libraries(vbam-core-base
INTERFACE vbam-fex stb-image PRIVATE vbam-fex stb-image
PUBLIC ${ZLIB_LIBRARY} PUBLIC ${ZLIB_LIBRARY}
) )

View File

@ -1,10 +0,0 @@
#ifndef VBAM_CORE_GBA_GBAFILTER_H_
#define VBAM_CORE_GBA_GBAFILTER_H_
#include <cstdint>
void gbafilter_pal(uint16_t* buf, int count);
void gbafilter_pal32(uint32_t* buf, int count);
void gbafilter_pad(uint8_t* buf, int count);
#endif // VBAM_CORE_GBA_GBAFILTER_H_

View File

@ -4,7 +4,10 @@
#include <cstring> #include <cstring>
#include "core/base/file_util.h" #include "core/base/file_util.h"
#include "core/base/port.h"
#include "core/gba/gba.h" #include "core/gba/gba.h"
#include "core/gba/gbaGlobals.h"
#include "core/gba/gbaRtc.h"
#include "core/gba/internal/gbaSram.h" #include "core/gba/internal/gbaSram.h"
#define FLASH_READ_ARRAY 0 #define FLASH_READ_ARRAY 0
@ -27,6 +30,62 @@ int flashDeviceID = 0x1b;
int flashManufacturerID = 0x32; int flashManufacturerID = 0x32;
int flashBank = 0; int flashBank = 0;
void flashDetectSaveType(const int size) {
uint32_t* p = (uint32_t*)&g_rom[0];
uint32_t* end = (uint32_t*)(&g_rom[0] + size);
int detectedSaveType = 0;
int flashSize = 0x10000;
bool rtcFound = false;
while (p < end) {
uint32_t d = READ32LE(p);
if (d == 0x52504545) {
if (memcmp(p, "EEPROM_", 7) == 0) {
if (detectedSaveType == 0 || detectedSaveType == 4)
detectedSaveType = 1;
}
} else if (d == 0x4D415253) {
if (memcmp(p, "SRAM_", 5) == 0) {
if (detectedSaveType == 0 || detectedSaveType == 1 || detectedSaveType == 4)
detectedSaveType = 2;
}
} else if (d == 0x53414C46) {
if (memcmp(p, "FLASH1M_", 8) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 3;
flashSize = 0x20000;
}
} else if (memcmp(p, "FLASH512_", 9) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 3;
flashSize = 0x10000;
}
} else if (memcmp(p, "FLASH", 5) == 0) {
if (detectedSaveType == 0) {
detectedSaveType = 4;
flashSize = 0x10000;
}
}
} else if (d == 0x52494953) {
if (memcmp(p, "SIIRTC_V", 8) == 0)
rtcFound = true;
}
p++;
}
// if no matches found, then set it to NONE
if (detectedSaveType == 0) {
detectedSaveType = 5;
}
if (detectedSaveType == 4) {
detectedSaveType = 3;
}
rtcEnable(rtcFound);
rtcEnableRumble(!rtcFound);
coreOptions.saveType = detectedSaveType;
flashSetSize(flashSize);
}
void flashInit() void flashInit()
{ {
memset(flashSaveMemory, 0xff, sizeof(flashSaveMemory)); memset(flashSaveMemory, 0xff, sizeof(flashSaveMemory));

View File

@ -9,6 +9,8 @@
#define FLASH_128K_SZ 0x20000 #define FLASH_128K_SZ 0x20000
void flashDetectSaveType(const int size);
#if defined(__LIBRETRO__) #if defined(__LIBRETRO__)
extern void flashSaveGame(uint8_t*& data); extern void flashSaveGame(uint8_t*& data);
extern void flashReadGame(const uint8_t*& data); extern void flashReadGame(const uint8_t*& data);

View File

@ -25,22 +25,22 @@ Copyright: 2011-2017 VBA-M development team
2011 Thomas J. Moore (aka tjm, aka darktjm) <darktjm@gmail.com> 2011 Thomas J. Moore (aka tjm, aka darktjm) <darktjm@gmail.com>
License: GPL-2+ License: GPL-2+
Files: fex/* Files: src/core/fex/*
Copyright: 2005-2009 Shay Green <gblargg@gmail.com> Copyright: 2005-2009 Shay Green <gblargg@gmail.com>
License: LGPL-2.1+ License: LGPL-2.1+
Files: fex/7z_C/* Files: src/core/fex/7z_C/*
Copyright: 2008-2010 Igor Pavlov Copyright: 2008-2010 Igor Pavlov
License: public-domain License: public-domain
Files: fex/7z_C/Ppmd.h Files: src/core/fex/7z_C/Ppmd.h
fex/7z_C/Ppmd7.* src/core/fex/7z_C/Ppmd7.*
fex/7z_C/Ppmd7Dec.c src/core/fex/7z_C/Ppmd7Dec.c
Copyright: 2010 Igor Pavlov Copyright: 2010 Igor Pavlov
2001 Dmitry Shkarin 2001 Dmitry Shkarin
License: public-domain License: public-domain
Files: src/apu/* Files: src/core/apu/*
Copyright: 2003-2007 Shay Green <gblargg@gmail.com> Copyright: 2003-2007 Shay Green <gblargg@gmail.com>
License: LGPL-2.1+ License: LGPL-2.1+
@ -51,30 +51,30 @@ Copyright: 2014, 2015 Sergio Benjamim (sergio-br2)
2006 Matteo Drera 2006 Matteo Drera
License: GPL-2+ License: GPL-2+
Files: src/common/iniparser.* Files: src/sdl/iniparser.*
src/common/dictionary.* src/sdl/dictionary.*
Copyright: 2010-2014 Nicolas Devillard <ndevilla@free.fr> Copyright: 2010-2014 Nicolas Devillard <ndevilla@free.fr>
License: Expat License: Expat
Files: src/common/memgzio.* Files: src/core/base/internal/memgzio.*
Copyright: 2007, 2009, 2011, 2012, 2013, 2015 VBA-M development team Copyright: 2007, 2009, 2011, 2012, 2013, 2015 VBA-M development team
????-2006 Forgotten ????-2006 Forgotten
1995-2002 Jean-loup Gailly 1995-2002 Jean-loup Gailly
License: Zlib License: Zlib
Files: src/filters/hq/asm/hq3x_16.asm Files: src/components/filters/hq/asm/hq3x_16.asm
src/filters/hq/asm/hq3x_32.asm src/components/filters/internal/hq/asm/hq3x_32.asm
src/filters/hq/asm/hq4x_16.asm src/components/filters/internal/hq/asm/hq4x_16.asm
src/filters/hq/asm/hq4x_32.asm src/components/filters/internal/hq/asm/hq4x_32.asm
Copyright: 2007, 2008 VBA-M development team Copyright: 2007, 2008 VBA-M development team
2003 Maxim Stepin (MaxSt) <maxst@hiend3d.com> 2003 Maxim Stepin (MaxSt) <maxst@hiend3d.com>
License: GPL-2+ License: GPL-2+
Files: src/filters/hq/asm/macros.mac Files: src/components/filters/internal/hq/asm/macros.mac
Copyright: 1997-2007 ZSNES Team (zsKnight, _Demo_, pagefault, Nach) Copyright: 1997-2007 ZSNES Team (zsKnight, _Demo_, pagefault, Nach)
License: GPL-2+ License: GPL-2+
Files: src/filters/xBRZ/* Files: src/components/filters/internal/xBRZ/*
Copyright: 2012-2015 Zenju (zenju AT gmx DOT de) Copyright: 2012-2015 Zenju (zenju AT gmx DOT de)
License: GPL-3 License: GPL-3
Additionally and as a special exception, the author gives permission Additionally and as a special exception, the author gives permission
@ -86,12 +86,12 @@ License: GPL-3
of the file, but you are not obligated to do so. If you do not wish to of the file, but you are not obligated to do so. If you do not wish to
do so, delete this exception statement from your version. do so, delete this exception statement from your version.
Files: src/filters/2xSaI.cpp Files: src/components/filters/internal/2xSaI.cpp
src/filters/2xSaImmx.asm src/components/filters/internal/2xSaImmx.asm
Copyright: 1999-2001 Derek Liauw Kie Fa (aka Kreed) <DerekL666@yahoo.com> Copyright: 1999-2001 Derek Liauw Kie Fa (aka Kreed) <DerekL666@yahoo.com>
License: GPL-2+ License: GPL-2+
Files: src/filters/admame.cpp Files: src/components/filters/internal/admame.cpp
Copyright: 1999-2002 Andrea Mazzoleni Copyright: 1999-2002 Andrea Mazzoleni
License: GPL-2+ License: GPL-2+
In addition, as a special exception, Andrea Mazzoleni In addition, as a special exception, Andrea Mazzoleni
@ -109,15 +109,15 @@ License: GPL-2+
- the program is not used in commercial activities. - the program is not used in commercial activities.
- the whole source code of the program is released with the binary. - the whole source code of the program is released with the binary.
Files: src/filters/bilinear.cpp Files: src/components/filters/internal/bilinear.cpp
Copyright: 2008, 2009 VBA-M development team Copyright: 2008, 2009 VBA-M development team
2004 Forgotten and the VBA development team 2004 Forgotten and the VBA development team
2003 Forgotten 2003 Forgotten
2000 Jeffrey S. Freedman (JSF) 2000 Jeffrey S. Freedman (JSF)
License: GPL-2+ License: GPL-2+
Files: src/filters/hq2x.* Files: src/components/filters/internal/hq2x.*
src/filters/interp.h src/components/filters/internal/interp.h
Copyright: 2003 Andrea Mazzoleni Copyright: 2003 Andrea Mazzoleni
License: GPL-2+ License: GPL-2+
In addition, as a special exception, Andrea Mazzoleni In addition, as a special exception, Andrea Mazzoleni
@ -130,7 +130,7 @@ License: GPL-2+
file, but you are not obligated to do so. If you do not wish to file, but you are not obligated to do so. If you do not wish to
do so, delete this exception statement from your version. do so, delete this exception statement from your version.
Files: src/gba/debugger-expr-yacc.* Files: src/core/gba/debugger-expr-yacc.*
Copyright: 2015 VBA-M development team Copyright: 2015 VBA-M development team
1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
License: GPL-2+ License: GPL-2+
@ -147,7 +147,7 @@ License: GPL-2+
This special exception was added by the Free Software Foundation in This special exception was added by the Free Software Foundation in
version 2.2 of Bison. version 2.2 of Bison.
Files: src/gba/GBALink.* Files: src/core/gba/GBALink.*
Copyright: 2008, 2009, 2010, 2011, 2012, 2015 VBA-M development team Copyright: 2008, 2009, 2010, 2011, 2012, 2015 VBA-M development team
???? Thomas J. Moore (aka tjm, aka darktjm) <darktjm@gmail.com> ???? Thomas J. Moore (aka tjm, aka darktjm) <darktjm@gmail.com>
2004-2006 denopqrihg <denopqrihg@users.sourceforge.net> <denopqrihg@centrum.cz> 2004-2006 denopqrihg <denopqrihg@users.sourceforge.net> <denopqrihg@centrum.cz>

View File

@ -17,9 +17,6 @@ endif
SOURCES_CXX := SOURCES_CXX :=
SOURCES_CXX += \
$(CORE_DIR)/Util_common.cpp \
SOURCES_CXX += \ SOURCES_CXX += \
$(CORE_DIR)/libretro/libretro.cpp \ $(CORE_DIR)/libretro/libretro.cpp \
$(CORE_DIR)/libretro/SoundRetro.cpp $(CORE_DIR)/libretro/SoundRetro.cpp
@ -72,5 +69,5 @@ SOURCES_CXX += \
# Filters # Filters
SOURCES_CXX += \ SOURCES_CXX += \
$(CORE_DIR)/filters/interframe.cpp \ $(CORE_DIR)/components/filters_agb/filters_agb.cpp \
$(CORE_DIR)/core/gba/gbaFilter.cpp $(CORE_DIR)/components/filters_interframe/interframe.cpp

View File

@ -10,7 +10,8 @@
#include "libretro_core_options.h" #include "libretro_core_options.h"
#include "scrc32.h" #include "scrc32.h"
#include "../Util.h" #include "components/filters_agb/filters_agb.h"
#include "components/filters_interframe/interframe.h"
#include "core/base/system.h" #include "core/base/system.h"
#include "core/base/file_util.h" #include "core/base/file_util.h"
#include "core/base/sizes.h" #include "core/base/sizes.h"
@ -26,8 +27,6 @@
#include "core/gba/gbaRtc.h" #include "core/gba/gbaRtc.h"
#include "core/gba/gbaSound.h" #include "core/gba/gbaSound.h"
#include "../filters/interframe.hpp"
#define FRAMERATE (16777216.0 / 280896.0) // 59.73 #define FRAMERATE (16777216.0 / 280896.0) // 59.73
#define SAMPLERATE 32768.0 #define SAMPLERATE 32768.0
@ -855,7 +854,7 @@ static void load_image_preferences(void)
coreOptions.mirroringEnable = (buffer[0] == 'F') ? true : false; coreOptions.mirroringEnable = (buffer[0] == 'F') ? true : false;
if (!coreOptions.cpuSaveType) if (!coreOptions.cpuSaveType)
utilGBAFindSave(romSize); flashDetectSaveType(romSize);
coreOptions.saveType = coreOptions.cpuSaveType; coreOptions.saveType = coreOptions.cpuSaveType;
@ -1220,7 +1219,7 @@ static void update_variables(bool startup)
bool prev_lcdfilter = option_lcdfilter; bool prev_lcdfilter = option_lcdfilter;
option_lcdfilter = (!strcmp(var.value, "enabled")) ? true : false; option_lcdfilter = (!strcmp(var.value, "enabled")) ? true : false;
if (prev_lcdfilter != option_lcdfilter) if (prev_lcdfilter != option_lcdfilter)
utilUpdateSystemColorMaps(option_lcdfilter); gbafilter_update_colors(option_lcdfilter);
} }
var.key = "vbam_interframeblending"; var.key = "vbam_interframeblending";
@ -1610,7 +1609,7 @@ bool retro_load_game(const struct retro_game_info *game)
return false; return false;
} }
utilUpdateSystemColorMaps(option_lcdfilter); gbafilter_update_colors(option_lcdfilter);
update_variables(true); update_variables(true);
soundInit(); soundInit();

View File

@ -1,4 +1,5 @@
#include "ConfigManager.h" #include "ConfigManager.h"
#include "components/user_config/user_config.h"
// necessary to get portable strerror_r // necessary to get portable strerror_r
#undef _GNU_SOURCE #undef _GNU_SOURCE
@ -14,7 +15,6 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include "../Util.h"
#include "core/base/file_util.h" #include "core/base/file_util.h"
#include "core/gb/gbGlobals.h" #include "core/gb/gbGlobals.h"
#include "core/gb/gbSound.h" #include "core/gb/gbSound.h"
@ -452,7 +452,7 @@ const char* FindConfigFile(const char *name)
mkdir(fullDir, 0755); mkdir(fullDir, 0755);
if (fullDir) { if (fullDir) {
sprintf(path, "%s%c%s", fullDir, FILE_SEP, name); sprintf(path, "%s%c%s", fullDir, kFileSep, name);
if (FileExists(path)) if (FileExists(path))
{ {
return path; return path;
@ -462,7 +462,7 @@ const char* FindConfigFile(const char *name)
#ifdef _WIN32 #ifdef _WIN32
char *home = getenv("USERPROFILE"); char *home = getenv("USERPROFILE");
if (home != NULL) { if (home != NULL) {
sprintf(path, "%s%c%s", home, FILE_SEP, name); sprintf(path, "%s%c%s", home, kFileSep, name);
if (FileExists(path)) if (FileExists(path))
{ {
return path; return path;
@ -479,10 +479,10 @@ const char* FindConfigFile(const char *name)
char *tok = strtok(buffer, PATH_SEP); char *tok = strtok(buffer, PATH_SEP);
while (tok) { while (tok) {
sprintf(env_path, "%s%c%s", tok, FILE_SEP, EXE_NAME); sprintf(env_path, "%s%c%s", tok, kFileSep, EXE_NAME);
if (FileExists(env_path)) { if (FileExists(env_path)) {
static char path2[2048]; static char path2[2048];
sprintf(path2, "%s%c%s", tok, FILE_SEP, name); sprintf(path2, "%s%c%s", tok, kFileSep, name);
if (FileExists(path2)) { if (FileExists(path2)) {
return path2; return path2;
} }
@ -494,10 +494,10 @@ const char* FindConfigFile(const char *name)
else { else {
// executable is relative to some directory // executable is relative to some directory
strcpy(buffer, arg0); strcpy(buffer, arg0);
char *p = strrchr(buffer, FILE_SEP); char *p = strrchr(buffer, kFileSep);
if (p) { if (p) {
*p = 0; *p = 0;
sprintf(path, "%s%c%s", buffer, FILE_SEP, name); sprintf(path, "%s%c%s", buffer, kFileSep, name);
if (FileExists(path)) if (FileExists(path))
{ {
return path; return path;
@ -505,13 +505,13 @@ const char* FindConfigFile(const char *name)
} }
} }
#else // ! _WIN32 #else // ! _WIN32
sprintf(path, "%s%c%s", PKGDATADIR, FILE_SEP, name); sprintf(path, "%s%c%s", PKGDATADIR, kFileSep, name);
if (FileExists(path)) if (FileExists(path))
{ {
return path; return path;
} }
sprintf(path, "%s%c%s", SYSCONF_INSTALL_DIR, FILE_SEP, name); sprintf(path, "%s%c%s", SYSCONF_INSTALL_DIR, kFileSep, name);
if (FileExists(path)) if (FileExists(path))
{ {
return path; return path;

View File

@ -43,7 +43,10 @@
#include <SDL.h> #include <SDL.h>
#include "../Util.h" #include "components/audio_sdl/audio_sdl.h"
#include "components/draw_text/draw_text.h"
#include "components/filters_agb/filters_agb.h"
#include "components/user_config/user_config.h"
#include "core/base/file_util.h" #include "core/base/file_util.h"
#include "core/base/message.h" #include "core/base/message.h"
#include "core/base/patch.h" #include "core/base/patch.h"
@ -59,12 +62,10 @@
#include "core/gba/gbaRtc.h" #include "core/gba/gbaRtc.h"
#include "core/gba/gbaSound.h" #include "core/gba/gbaSound.h"
#include "../common/SoundSDL.h"
#include "ConfigManager.h" #include "ConfigManager.h"
#include "filters.h" #include "filters.h"
#include "inputSDL.h" #include "inputSDL.h"
#include "text.h"
// from: https://stackoverflow.com/questions/7608714/why-is-my-pointer-not-null-after-free // from: https://stackoverflow.com/questions/7608714/why-is-my-pointer-not-null-after-free
#define freeSafe(ptr) free(ptr); ptr = NULL; #define freeSafe(ptr) free(ptr); ptr = NULL;
@ -287,7 +288,7 @@ void StartLirc(void)
fprintf(stdout, "Success\n"); fprintf(stdout, "Success\n");
//read the config file //read the config file
char LIRCConfigLoc[2048]; char LIRCConfigLoc[2048];
sprintf(LIRCConfigLoc, "%s%c%s", homeConfigDir, FILE_SEP, "lircrc"); sprintf(LIRCConfigLoc, "%s%c%s", homeConfigDir, kFileSep, "lircrc");
fprintf(stdout, "LIRC Config file:"); fprintf(stdout, "LIRC Config file:");
if (lirc_readconfig(LIRCConfigLoc, &LIRCConfigInfo, NULL) == 0) { if (lirc_readconfig(LIRCConfigLoc, &LIRCConfigInfo, NULL) == 0) {
//check vbam dir for lircrc //check vbam dir for lircrc
@ -349,7 +350,7 @@ bool sdlCheckDirectory(const char* dir)
char* sdlGetFilename(const char* name) char* sdlGetFilename(const char* name)
{ {
char path[1024]; char path[1024];
const char *filename = strrchr(name, FILE_SEP); const char *filename = strrchr(name, kFileSep);
if (filename) if (filename)
strcpy(path, filename + 1); strcpy(path, filename + 1);
else else
@ -360,7 +361,7 @@ char* sdlGetFilename(const char* name)
char* sdlGetFilePath(const char* name) char* sdlGetFilePath(const char* name)
{ {
char path[1024]; char path[1024];
const char *filename = strrchr(name, FILE_SEP); const char *filename = strrchr(name, kFileSep);
if (filename) { if (filename) {
size_t length = strlen(name) - strlen(filename); size_t length = strlen(name) - strlen(filename);
memcpy(path, name, length); memcpy(path, name, length);
@ -368,7 +369,7 @@ char* sdlGetFilePath(const char* name)
} }
else { else {
path[0] = '.'; path[0] = '.';
path[1] = FILE_SEP; path[1] = kFileSep;
path[2] = '\0'; path[2] = '\0';
} }
return strdup(path); return strdup(path);
@ -381,11 +382,11 @@ FILE* sdlFindFile(const char* name)
#ifdef _WIN32 #ifdef _WIN32
#define PATH_SEP ";" #define PATH_SEP ";"
#define FILE_SEP '\\' #define kFileSep '\\'
#define EXE_NAME "vbam.exe" #define EXE_NAME "vbam.exe"
#else // ! _WIN32 #else // ! _WIN32
#define PATH_SEP ":" #define PATH_SEP ":"
#define FILE_SEP '/' #define kFileSep '/'
#define EXE_NAME "vbam" #define EXE_NAME "vbam"
#endif // ! _WIN32 #endif // ! _WIN32
@ -402,7 +403,7 @@ FILE* sdlFindFile(const char* name)
if (strlen(homeDataDir)) { if (strlen(homeDataDir)) {
fprintf(stdout, "Searching home directory: %s\n", homeDataDir); fprintf(stdout, "Searching home directory: %s\n", homeDataDir);
sprintf(path, "%s%c%s", homeDataDir, FILE_SEP, name); sprintf(path, "%s%c%s", homeDataDir, kFileSep, name);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) if (f != NULL)
return f; return f;
@ -412,7 +413,7 @@ FILE* sdlFindFile(const char* name)
char* profileDir = getenv("USERPROFILE"); char* profileDir = getenv("USERPROFILE");
if (profileDir != NULL) { if (profileDir != NULL) {
fprintf(stdout, "Searching user profile directory: %s\n", profileDir); fprintf(stdout, "Searching user profile directory: %s\n", profileDir);
sprintf(path, "%s%c%s", profileDir, FILE_SEP, name); sprintf(path, "%s%c%s", profileDir, kFileSep, name);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) if (f != NULL)
return f; return f;
@ -428,12 +429,12 @@ FILE* sdlFindFile(const char* name)
char* tok = strtok(buffer, PATH_SEP); char* tok = strtok(buffer, PATH_SEP);
while (tok) { while (tok) {
sprintf(path, "%s%c%s", tok, FILE_SEP, EXE_NAME); sprintf(path, "%s%c%s", tok, kFileSep, EXE_NAME);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) { if (f != NULL) {
char path2[2048]; char path2[2048];
fclose(f); fclose(f);
sprintf(path2, "%s%c%s", tok, FILE_SEP, name); sprintf(path2, "%s%c%s", tok, kFileSep, name);
f = fopen(path2, "r"); f = fopen(path2, "r");
if (f != NULL) { if (f != NULL) {
fprintf(stdout, "Found at %s\n", path2); fprintf(stdout, "Found at %s\n", path2);
@ -447,10 +448,10 @@ FILE* sdlFindFile(const char* name)
// executable is relative to some directory // executable is relative to some directory
fprintf(stdout, "Searching executable directory\n"); fprintf(stdout, "Searching executable directory\n");
strcpy(buffer, home); strcpy(buffer, home);
char* p = strrchr(buffer, FILE_SEP); char* p = strrchr(buffer, kFileSep);
if (p) { if (p) {
*p = 0; *p = 0;
sprintf(path, "%s%c%s", buffer, FILE_SEP, name); sprintf(path, "%s%c%s", buffer, kFileSep, name);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) if (f != NULL)
return f; return f;
@ -458,13 +459,13 @@ FILE* sdlFindFile(const char* name)
} }
#else // ! _WIN32 #else // ! _WIN32
fprintf(stdout, "Searching data directory: %s\n", PKGDATADIR); fprintf(stdout, "Searching data directory: %s\n", PKGDATADIR);
sprintf(path, "%s%c%s", PKGDATADIR, FILE_SEP, name); sprintf(path, "%s%c%s", PKGDATADIR, kFileSep, name);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) if (f != NULL)
return f; return f;
fprintf(stdout, "Searching system config directory: %s\n", SYSCONF_INSTALL_DIR); fprintf(stdout, "Searching system config directory: %s\n", SYSCONF_INSTALL_DIR);
sprintf(path, "%s%c%s", SYSCONF_INSTALL_DIR, FILE_SEP, name); sprintf(path, "%s%c%s", SYSCONF_INSTALL_DIR, kFileSep, name);
f = fopen(path, "r"); f = fopen(path, "r");
if (f != NULL) if (f != NULL)
return f; return f;
@ -652,11 +653,11 @@ static char* sdlStateName(int num)
char *gameFile = sdlGetFilename(filename); char *gameFile = sdlGetFilename(filename);
if (saveDir) if (saveDir)
sprintf(stateName, "%s%c%s%d.sgm", saveDir, FILE_SEP, gameFile, num + 1); sprintf(stateName, "%s%c%s%d.sgm", saveDir, kFileSep, gameFile, num + 1);
else if (access(gameDir, W_OK) == 0) else if (access(gameDir, W_OK) == 0)
sprintf(stateName, "%s%c%s%d.sgm", gameDir, FILE_SEP, gameFile, num + 1); sprintf(stateName, "%s%c%s%d.sgm", gameDir, kFileSep, gameFile, num + 1);
else else
sprintf(stateName, "%s%c%s%d.sgm", homeDataDir, FILE_SEP, gameFile, num + 1); sprintf(stateName, "%s%c%s%d.sgm", homeDataDir, kFileSep, gameFile, num + 1);
freeSafe(gameDir); freeSafe(gameDir);
freeSafe(gameFile); freeSafe(gameFile);
@ -755,11 +756,11 @@ void sdlWriteBattery()
char *gameFile = sdlGetFilename(filename); char *gameFile = sdlGetFilename(filename);
if (batteryDir) if (batteryDir)
sprintf(buffer, "%s%c%s.sav", batteryDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", batteryDir, kFileSep, gameFile);
else if (access(gameDir, W_OK) == 0) else if (access(gameDir, W_OK) == 0)
sprintf(buffer, "%s%c%s.sav", gameDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", gameDir, kFileSep, gameFile);
else else
sprintf(buffer, "%s%c%s.sav", homeDataDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", homeDataDir, kFileSep, gameFile);
bool result = emulator.emuWriteBattery(buffer); bool result = emulator.emuWriteBattery(buffer);
@ -777,11 +778,11 @@ void sdlReadBattery()
char *gameFile = sdlGetFilename(filename); char *gameFile = sdlGetFilename(filename);
if (batteryDir) if (batteryDir)
sprintf(buffer, "%s%c%s.sav", batteryDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", batteryDir, kFileSep, gameFile);
else if (access(gameDir, W_OK) == 0) else if (access(gameDir, W_OK) == 0)
sprintf(buffer, "%s%c%s.sav", gameDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", gameDir, kFileSep, gameFile);
else else
sprintf(buffer, "%s%c%s.sav", homeDataDir, FILE_SEP, gameFile); sprintf(buffer, "%s%c%s.sav", homeDataDir, kFileSep, gameFile);
bool result = emulator.emuReadBattery(buffer); bool result = emulator.emuReadBattery(buffer);
@ -1737,7 +1738,7 @@ int main(int argc, char** argv)
failed = (size == 0); failed = (size == 0);
if (!failed) { if (!failed) {
if (coreOptions.cpuSaveType == 0) if (coreOptions.cpuSaveType == 0)
utilGBAFindSave(size); flashDetectSaveType(size);
else else
coreOptions.saveType = coreOptions.cpuSaveType; coreOptions.saveType = coreOptions.cpuSaveType;
@ -1847,7 +1848,7 @@ int main(int argc, char** argv)
fprintf(stdout, "Color depth: %d\n", systemColorDepth); fprintf(stdout, "Color depth: %d\n", systemColorDepth);
utilUpdateSystemColorMaps(); gbafilter_update_colors();
if (delta == NULL) { if (delta == NULL) {
delta = (uint8_t*)malloc(delta_size); delta = (uint8_t*)malloc(delta_size);
@ -2145,20 +2146,20 @@ void systemScreenCapture(int a)
if (captureFormat) { if (captureFormat) {
if (screenShotDir) if (screenShotDir)
sprintf(buffer, "%s%c%s%02d.bmp", screenShotDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.bmp", screenShotDir, kFileSep, gameFile, a);
else if (access(gameDir, W_OK) == 0) else if (access(gameDir, W_OK) == 0)
sprintf(buffer, "%s%c%s%02d.bmp", gameDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.bmp", gameDir, kFileSep, gameFile, a);
else else
sprintf(buffer, "%s%c%s%02d.bmp", homeDataDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.bmp", homeDataDir, kFileSep, gameFile, a);
result = emulator.emuWriteBMP(buffer); result = emulator.emuWriteBMP(buffer);
} else { } else {
if (screenShotDir) if (screenShotDir)
sprintf(buffer, "%s%c%s%02d.png", screenShotDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.png", screenShotDir, kFileSep, gameFile, a);
else if (access(gameDir, W_OK) == 0) else if (access(gameDir, W_OK) == 0)
sprintf(buffer, "%s%c%s%02d.png", gameDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.png", gameDir, kFileSep, gameFile, a);
else else
sprintf(buffer, "%s%c%s%02d.png", homeDataDir, FILE_SEP, gameFile, a); sprintf(buffer, "%s%c%s%02d.png", homeDataDir, kFileSep, gameFile, a);
result = emulator.emuWritePNG(buffer); result = emulator.emuWritePNG(buffer);
} }

View File

@ -18,206 +18,25 @@
#include "filters.h" #include "filters.h"
#include "../filters/interframe.hpp" #include "components/filters/filters.h"
#include "components/filters_interframe/interframe.h"
// namespace {
// Screen filters
//
extern int Init_2xSaI(uint32_t);
extern void hq2x_init(unsigned);
extern bool sdlStretchInit(int colorDepth, int sizeMultiplier, int srcWidth);
extern void sdlStretch1x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void sdlStretch2x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void sdlStretch3x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void sdlStretch4x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void _2xSaI(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void _2xSaI32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Super2xSaI(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Super2xSaI32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void SuperEagle(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void SuperEagle32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Pixelate(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Pixelate32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void AdMame2x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void AdMame2x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Bilinear(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Bilinear32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void BilinearPlus(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void BilinearPlus32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Scanlines(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void Scanlines32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void ScanlinesTV(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void ScanlinesTV32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq2x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq2x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void lq2x(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void lq2x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq3x16(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq4x16(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq3x32_32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void hq4x32_32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void xbrz2x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void xbrz3x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void xbrz4x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void xbrz5x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
extern void xbrz6x32(uint8_t*, uint32_t, uint8_t*, uint8_t*, uint32_t, int, int);
struct FilterDesc {
char name[30];
int enlargeFactor;
FilterFunc func16;
FilterFunc func24;
FilterFunc func32;
};
const FilterDesc Filters[] = {
{ "Stretch 1x", 1, sdlStretch1x, sdlStretch1x, sdlStretch1x },
{ "Stretch 2x", 2, sdlStretch2x, sdlStretch2x, sdlStretch2x },
{ "2xSaI", 2, _2xSaI, 0, _2xSaI32 },
{ "Super 2xSaI", 2, Super2xSaI, 0, Super2xSaI32 },
{ "Super Eagle", 2, SuperEagle, 0, SuperEagle32 },
{ "Pixelate", 2, Pixelate, 0, Pixelate32 },
{ "AdvanceMAME Scale2x", 2, AdMame2x, 0, AdMame2x32 },
{ "Bilinear", 2, Bilinear, 0, Bilinear32 },
{ "Bilinear Plus", 2, BilinearPlus, 0, BilinearPlus32 },
{ "Scanlines", 2, Scanlines, 0, Scanlines32 },
{ "TV Mode", 2, ScanlinesTV, 0, ScanlinesTV32 },
{ "lq2x", 2, lq2x, 0, lq2x32 },
{ "hq2x", 2, hq2x, 0, hq2x32 },
{ "xbrz2x", 2, 0, 0, xbrz2x32 },
{ "Stretch 3x", 3, sdlStretch3x, sdlStretch3x, sdlStretch3x },
{ "hq3x", 3, hq3x16, 0, hq3x32_32 },
{ "xbrz3x", 3, 0, 0, xbrz3x32 },
{ "Stretch 4x", 4, sdlStretch4x, sdlStretch4x, sdlStretch4x },
{ "hq4x", 4, hq4x16, 0, hq4x32_32 },
{ "xbrz4x", 4, 0, 0, xbrz4x32 },
{ "xbrz5x", 5, 0, 0, xbrz5x32 },
{ "xbrz6x", 6, 0, 0, xbrz6x32 }
};
int getFilterEnlargeFactor(const int f)
{
return Filters[f].enlargeFactor;
}
char* getFilterName(const int f)
{
return (char*)Filters[f].name;
}
FilterFunc initFilter(const int f, const int colorDepth, const int srcWidth)
{
FilterFunc func;
switch (colorDepth) {
case 15:
case 16:
func = Filters[f].func16;
break;
case 24:
func = Filters[f].func24;
break;
case 32:
func = Filters[f].func32;
break;
default:
func = 0;
break;
}
if (func)
switch (f) {
case kStretch1x:
sdlStretchInit(colorDepth, 0, srcWidth);
break;
case kStretch2x:
sdlStretchInit(colorDepth, 1, srcWidth);
break;
case kStretch3x:
sdlStretchInit(colorDepth, 2, srcWidth);
break;
case kStretch4x:
sdlStretchInit(colorDepth, 3, srcWidth);
break;
case k2xSaI:
case kSuper2xSaI:
case kSuperEagle:
if (colorDepth == 15)
Init_2xSaI(555);
else if (colorDepth == 16)
Init_2xSaI(565);
else
Init_2xSaI(colorDepth);
break;
case khq2x:
case klq2x:
hq2x_init(colorDepth);
break;
default:
break;
}
return func;
}
struct IFBFilterDesc {
char name[30];
IFBFilterFunc func16;
IFBFilterFunc func32;
};
const IFBFilterDesc IFBFilters[] = {
{ "No interframe blending", 0, 0 },
{ "Interframe motion blur", MotionBlurIB, MotionBlurIB32 },
{ "Smart interframe blending", SmartIB, SmartIB32 }
};
IFBFilterFunc initIFBFilter(const int f, const int colorDepth)
{
IFBFilterFunc func;
switch (colorDepth) {
case 15:
case 16:
func = IFBFilters[f].func16;
break;
case 32:
func = IFBFilters[f].func32;
break;
case 24:
default:
func = 0;
break;
}
return func;
}
char* getIFBFilterName(const IFBFilter f)
{
return (char*)IFBFilters[f].name;
}
// //
// Optimized stretchers implementation // Optimized stretchers implementation
// //
#ifndef C_CORE #ifndef C_CORE
uint8_t sdlStretcher[16384]; uint8_t sdlStretcher[16384];
#ifdef _MSC_VER #ifdef _MSC_VER
#define SDL_CALL_STRETCHER \
{ \
__asm mov eax, stretcher __asm mov edi, destPtr __asm mov esi, srcPtr __asm call eax \
}
#else
#define SDL_CALL_STRETCHER \ #define SDL_CALL_STRETCHER \
asm volatile("call *%%eax" ::"a"(stretcher), "S"(srcPtr), "D"(dstPtr)) { __asm mov eax, stretcher __asm mov edi, destPtr __asm mov esi, srcPtr __asm call eax }
#else
#define SDL_CALL_STRETCHER asm volatile("call *%%eax" ::"a"(stretcher), "S"(srcPtr), "D"(dstPtr))
#endif #endif
#define SDL_LONG(val) \ #define SDL_LONG(val) \
*((uint32_t*)&sdlStretcher[sdlStretcherPos]) = val; \ *((uint32_t*)&sdlStretcher[sdlStretcherPos]) = val; \
sdlStretcherPos += 4; sdlStretcherPos += 4;
@ -282,38 +101,27 @@ uint8_t sdlStretcher[16384];
sdlStretcher[sdlStretcherPos++] = 0xc7; \ sdlStretcher[sdlStretcherPos++] = 0xc7; \
sdlStretcher[sdlStretcherPos++] = 0x03; sdlStretcher[sdlStretcherPos++] = 0x03;
#define SDL_RET \ #define SDL_RET sdlStretcher[sdlStretcherPos++] = 0xc3;
sdlStretcher[sdlStretcherPos++] = 0xc3;
#define SDL_PUSH_EAX \ #define SDL_PUSH_EAX sdlStretcher[sdlStretcherPos++] = 0x50;
sdlStretcher[sdlStretcherPos++] = 0x50;
#define SDL_PUSH_ECX \ #define SDL_PUSH_ECX sdlStretcher[sdlStretcherPos++] = 0x51;
sdlStretcher[sdlStretcherPos++] = 0x51;
#define SDL_PUSH_EBX \ #define SDL_PUSH_EBX sdlStretcher[sdlStretcherPos++] = 0x53;
sdlStretcher[sdlStretcherPos++] = 0x53;
#define SDL_PUSH_ESI \ #define SDL_PUSH_ESI sdlStretcher[sdlStretcherPos++] = 0x56;
sdlStretcher[sdlStretcherPos++] = 0x56;
#define SDL_PUSH_EDI \ #define SDL_PUSH_EDI sdlStretcher[sdlStretcherPos++] = 0x57;
sdlStretcher[sdlStretcherPos++] = 0x57;
#define SDL_POP_EAX \ #define SDL_POP_EAX sdlStretcher[sdlStretcherPos++] = 0x58;
sdlStretcher[sdlStretcherPos++] = 0x58;
#define SDL_POP_ECX \ #define SDL_POP_ECX sdlStretcher[sdlStretcherPos++] = 0x59;
sdlStretcher[sdlStretcherPos++] = 0x59;
#define SDL_POP_EBX \ #define SDL_POP_EBX sdlStretcher[sdlStretcherPos++] = 0x5b;
sdlStretcher[sdlStretcherPos++] = 0x5b;
#define SDL_POP_ESI \ #define SDL_POP_ESI sdlStretcher[sdlStretcherPos++] = 0x5e;
sdlStretcher[sdlStretcherPos++] = 0x5e;
#define SDL_POP_EDI \ #define SDL_POP_EDI sdlStretcher[sdlStretcherPos++] = 0x5f;
sdlStretcher[sdlStretcherPos++] = 0x5f;
#define SDL_MOV_ECX(val) \ #define SDL_MOV_ECX(val) \
sdlStretcher[sdlStretcherPos++] = 0xb9; \ sdlStretcher[sdlStretcherPos++] = 0xb9; \
@ -332,137 +140,134 @@ uint8_t sdlStretcher[16384];
sdlStretcher[sdlStretcherPos++] = 0xf3; \ sdlStretcher[sdlStretcherPos++] = 0xf3; \
sdlStretcher[sdlStretcherPos++] = 0xa5; sdlStretcher[sdlStretcherPos++] = 0xa5;
void sdlMakeStretcher(int width, int sizeOption) void sdlMakeStretcher(int width, int sizeOption) {
{
int sdlStretcherPos; int sdlStretcherPos;
sdlStretcherPos = 0; sdlStretcherPos = 0;
switch (systemColorDepth) { switch (systemColorDepth) {
case 16: case 16:
if (sizeOption) { if (sizeOption) {
SDL_PUSH_EAX; SDL_PUSH_EAX;
SDL_PUSH_ESI; SDL_PUSH_ESI;
SDL_PUSH_EDI; SDL_PUSH_EDI;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
SDL_LOADW; SDL_LOADW;
SDL_STOREW;
SDL_STOREW;
if (sizeOption > 1) {
SDL_STOREW; SDL_STOREW;
}
if (sizeOption > 2) {
SDL_STOREW; SDL_STOREW;
if (sizeOption > 1) {
SDL_STOREW;
}
if (sizeOption > 2) {
SDL_STOREW;
}
} }
SDL_POP_EDI;
SDL_POP_ESI;
SDL_POP_EAX;
SDL_RET;
} else {
SDL_PUSH_ESI;
SDL_PUSH_EDI;
SDL_PUSH_ECX;
SDL_MOV_ECX(width);
SDL_REP_MOVSW;
SDL_POP_ECX;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_RET;
} }
SDL_POP_EDI; break;
SDL_POP_ESI; case 24:
SDL_POP_EAX; if (sizeOption) {
SDL_RET; SDL_PUSH_EAX;
} else { SDL_PUSH_ESI;
SDL_PUSH_ESI; SDL_PUSH_EDI;
SDL_PUSH_EDI; int w = width - 1;
SDL_PUSH_ECX; for (int i = 0; i < w; i++) {
SDL_MOV_ECX(width); SDL_LOADL2;
SDL_REP_MOVSW; SDL_STOREL2;
SDL_POP_ECX; SDL_STOREL2;
SDL_POP_EDI; if (sizeOption > 1) {
SDL_POP_ESI; SDL_STOREL2;
SDL_RET; }
} if (sizeOption > 2) {
break; SDL_STOREL2;
case 24: }
if (sizeOption) { }
SDL_PUSH_EAX; // need to write the last one
SDL_PUSH_ESI;
SDL_PUSH_EDI;
int w = width - 1;
for (int i = 0; i < w; i++) {
SDL_LOADL2; SDL_LOADL2;
SDL_STOREL2; SDL_STOREL2;
SDL_STOREL2;
if (sizeOption > 1) { if (sizeOption > 1) {
SDL_STOREL2; SDL_STOREL2;
} }
if (sizeOption > 2) { if (sizeOption > 2) {
SDL_STOREL2; SDL_STOREL2;
} }
} SDL_AND_EAX(0x00ffffff);
// need to write the last one SDL_PUSH_EBX;
SDL_LOADL2; SDL_LOADL_EBX;
SDL_STOREL2; SDL_AND_EBX(0xff000000);
if (sizeOption > 1) { SDL_OR_EAX_EBX;
SDL_POP_EBX;
SDL_STOREL2; SDL_STOREL2;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_POP_EAX;
SDL_RET;
} else {
SDL_PUSH_ESI;
SDL_PUSH_EDI;
SDL_PUSH_ECX;
SDL_MOV_ECX(3 * width);
SDL_REP_MOVSB;
SDL_POP_ECX;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_RET;
} }
if (sizeOption > 2) { break;
SDL_STOREL2; case 32:
} if (sizeOption) {
SDL_AND_EAX(0x00ffffff); SDL_PUSH_EAX;
SDL_PUSH_EBX; SDL_PUSH_ESI;
SDL_LOADL_EBX; SDL_PUSH_EDI;
SDL_AND_EBX(0xff000000); for (int i = 0; i < width; i++) {
SDL_OR_EAX_EBX; SDL_LOADL;
SDL_POP_EBX;
SDL_STOREL2;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_POP_EAX;
SDL_RET;
} else {
SDL_PUSH_ESI;
SDL_PUSH_EDI;
SDL_PUSH_ECX;
SDL_MOV_ECX(3 * width);
SDL_REP_MOVSB;
SDL_POP_ECX;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_RET;
}
break;
case 32:
if (sizeOption) {
SDL_PUSH_EAX;
SDL_PUSH_ESI;
SDL_PUSH_EDI;
for (int i = 0; i < width; i++) {
SDL_LOADL;
SDL_STOREL;
SDL_STOREL;
if (sizeOption > 1) {
SDL_STOREL; SDL_STOREL;
}
if (sizeOption > 2) {
SDL_STOREL; SDL_STOREL;
if (sizeOption > 1) {
SDL_STOREL;
}
if (sizeOption > 2) {
SDL_STOREL;
}
} }
SDL_POP_EDI;
SDL_POP_ESI;
SDL_POP_EAX;
SDL_RET;
} else {
SDL_PUSH_ESI;
SDL_PUSH_EDI;
SDL_PUSH_ECX;
SDL_MOV_ECX(width);
SDL_REP_MOVSL;
SDL_POP_ECX;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_RET;
} }
SDL_POP_EDI; break;
SDL_POP_ESI;
SDL_POP_EAX;
SDL_RET;
} else {
SDL_PUSH_ESI;
SDL_PUSH_EDI;
SDL_PUSH_ECX;
SDL_MOV_ECX(width);
SDL_REP_MOVSL;
SDL_POP_ECX;
SDL_POP_EDI;
SDL_POP_ESI;
SDL_RET;
}
break;
} }
} }
#else // C_CORE #else // C_CORE
void (*sdlStretcher)(uint8_t*, uint8_t*, int) = 0; void (*sdlStretcher)(uint8_t*, uint8_t*, int) = 0;
#define SDL_CALL_STRETCHER \ #define SDL_CALL_STRETCHER sdlStretcher(srcPtr, dstPtr, width)
sdlStretcher(srcPtr, dstPtr, width)
template <typename T> template <typename T>
void sdlStretchx1(uint8_t* src, uint8_t* dest, int width) void sdlStretchx1(uint8_t* src, uint8_t* dest, int width) {
{
T* s = (T*)src; T* s = (T*)src;
T* d = (T*)dest; T* d = (T*)dest;
for (int i = 0; i < width; i++) for (int i = 0; i < width; i++)
@ -470,8 +275,7 @@ void sdlStretchx1(uint8_t* src, uint8_t* dest, int width)
} }
template <typename T> template <typename T>
void sdlStretchx2(uint8_t* src, uint8_t* dest, int width) void sdlStretchx2(uint8_t* src, uint8_t* dest, int width) {
{
T* s = (T*)src; T* s = (T*)src;
T* d = (T*)dest; T* d = (T*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -481,8 +285,7 @@ void sdlStretchx2(uint8_t* src, uint8_t* dest, int width)
} }
template <typename T> template <typename T>
void sdlStretchx3(uint8_t* src, uint8_t* dest, int width) void sdlStretchx3(uint8_t* src, uint8_t* dest, int width) {
{
T* s = (T*)src; T* s = (T*)src;
T* d = (T*)dest; T* d = (T*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -493,8 +296,7 @@ void sdlStretchx3(uint8_t* src, uint8_t* dest, int width)
} }
template <typename T> template <typename T>
void sdlStretchx4(uint8_t* src, uint8_t* dest, int width) void sdlStretchx4(uint8_t* src, uint8_t* dest, int width) {
{
T* s = (T*)src; T* s = (T*)src;
T* d = (T*)dest; T* d = (T*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -506,21 +308,12 @@ void sdlStretchx4(uint8_t* src, uint8_t* dest, int width)
} }
void (*sdlStretcher16[4])(uint8_t*, uint8_t*, int) = { void (*sdlStretcher16[4])(uint8_t*, uint8_t*, int) = {
sdlStretchx1<uint16_t>, sdlStretchx1<uint16_t>, sdlStretchx2<uint16_t>, sdlStretchx3<uint16_t>, sdlStretchx4<uint16_t>};
sdlStretchx2<uint16_t>,
sdlStretchx3<uint16_t>,
sdlStretchx4<uint16_t>
};
void (*sdlStretcher32[4])(uint8_t*, uint8_t*, int) = { void (*sdlStretcher32[4])(uint8_t*, uint8_t*, int) = {
sdlStretchx1<uint32_t>, sdlStretchx1<uint32_t>, sdlStretchx2<uint32_t>, sdlStretchx3<uint32_t>, sdlStretchx4<uint32_t>};
sdlStretchx2<uint32_t>,
sdlStretchx3<uint32_t>,
sdlStretchx4<uint32_t>
};
void sdlStretch24x1(uint8_t* src, uint8_t* dest, int width) void sdlStretch24x1(uint8_t* src, uint8_t* dest, int width) {
{
uint8_t* s = src; uint8_t* s = src;
uint8_t* d = dest; uint8_t* d = dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -530,8 +323,7 @@ void sdlStretch24x1(uint8_t* src, uint8_t* dest, int width)
} }
} }
void sdlStretch24x2(uint8_t* src, uint8_t* dest, int width) void sdlStretch24x2(uint8_t* src, uint8_t* dest, int width) {
{
uint8_t* s = (uint8_t*)src; uint8_t* s = (uint8_t*)src;
uint8_t* d = (uint8_t*)dest; uint8_t* d = (uint8_t*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -546,8 +338,7 @@ void sdlStretch24x2(uint8_t* src, uint8_t* dest, int width)
} }
} }
void sdlStretch24x3(uint8_t* src, uint8_t* dest, int width) void sdlStretch24x3(uint8_t* src, uint8_t* dest, int width) {
{
uint8_t* s = (uint8_t*)src; uint8_t* s = (uint8_t*)src;
uint8_t* d = (uint8_t*)dest; uint8_t* d = (uint8_t*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -566,8 +357,7 @@ void sdlStretch24x3(uint8_t* src, uint8_t* dest, int width)
} }
} }
void sdlStretch24x4(uint8_t* src, uint8_t* dest, int width) void sdlStretch24x4(uint8_t* src, uint8_t* dest, int width) {
{
uint8_t* s = (uint8_t*)src; uint8_t* s = (uint8_t*)src;
uint8_t* d = (uint8_t*)dest; uint8_t* d = (uint8_t*)dest;
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
@ -590,40 +380,40 @@ void sdlStretch24x4(uint8_t* src, uint8_t* dest, int width)
} }
} }
void (*sdlStretcher24[4])(uint8_t*, uint8_t*, int) = { void (*sdlStretcher24[4])(uint8_t*, uint8_t*, int) = {sdlStretch24x1, sdlStretch24x2,
sdlStretch24x1, sdlStretch24x3, sdlStretch24x4};
sdlStretch24x2,
sdlStretch24x3,
sdlStretch24x4
};
#endif // C_CORE #endif // C_CORE
bool sdlStretchInit(int colorDepth, int sizeMultiplier, int srcWidth) bool sdlStretchInit(int colorDepth, int sizeMultiplier, int srcWidth) {
{ (void)srcWidth; // unused params
(void)srcWidth; // unused params
#ifndef C_CORE #ifndef C_CORE
sdlMakeStretcher(srcWidth, sizeMultiplier); sdlMakeStretcher(srcWidth, sizeMultiplier);
#else #else
switch (colorDepth) { switch (colorDepth) {
case 16: case 16:
sdlStretcher = sdlStretcher16[sizeMultiplier]; sdlStretcher = sdlStretcher16[sizeMultiplier];
break; break;
case 24: case 24:
sdlStretcher = sdlStretcher24[sizeMultiplier]; sdlStretcher = sdlStretcher24[sizeMultiplier];
break; break;
case 32: case 32:
sdlStretcher = sdlStretcher32[sizeMultiplier]; sdlStretcher = sdlStretcher32[sizeMultiplier];
break; break;
default: default:
return false; return false;
} }
#endif #endif
return true; return true;
} }
void sdlStretch1x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, uint8_t* dstPtr, uint32_t dstPitch, int width, int height) void sdlStretch1x(uint8_t* srcPtr,
{ uint32_t srcPitch,
uint8_t* /* deltaPtr */,
uint8_t* dstPtr,
uint32_t dstPitch,
int width,
int height) {
int i; int i;
#ifndef C_CORE #ifndef C_CORE
uint32_t* stretcher = (uint32_t*)sdlStretcher; uint32_t* stretcher = (uint32_t*)sdlStretcher;
@ -634,8 +424,13 @@ void sdlStretch1x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, u
dstPtr += dstPitch; dstPtr += dstPitch;
} }
} }
void sdlStretch2x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, uint8_t* dstPtr, uint32_t dstPitch, int width, int height) void sdlStretch2x(uint8_t* srcPtr,
{ uint32_t srcPitch,
uint8_t* /* deltaPtr */,
uint8_t* dstPtr,
uint32_t dstPitch,
int width,
int height) {
int i; int i;
#ifndef C_CORE #ifndef C_CORE
uint32_t* stretcher = (uint32_t*)sdlStretcher; uint32_t* stretcher = (uint32_t*)sdlStretcher;
@ -648,8 +443,13 @@ void sdlStretch2x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, u
dstPtr += dstPitch; dstPtr += dstPitch;
} }
} }
void sdlStretch3x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, uint8_t* dstPtr, uint32_t dstPitch, int width, int height) void sdlStretch3x(uint8_t* srcPtr,
{ uint32_t srcPitch,
uint8_t* /* deltaPtr */,
uint8_t* dstPtr,
uint32_t dstPitch,
int width,
int height) {
int i; int i;
#ifndef C_CORE #ifndef C_CORE
uint32_t* stretcher = (uint32_t*)sdlStretcher; uint32_t* stretcher = (uint32_t*)sdlStretcher;
@ -664,8 +464,13 @@ void sdlStretch3x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, u
dstPtr += dstPitch; dstPtr += dstPitch;
} }
} }
void sdlStretch4x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, uint8_t* dstPtr, uint32_t dstPitch, int width, int height) void sdlStretch4x(uint8_t* srcPtr,
{ uint32_t srcPitch,
uint8_t* /* deltaPtr */,
uint8_t* dstPtr,
uint32_t dstPitch,
int width,
int height) {
int i; int i;
#ifndef C_CORE #ifndef C_CORE
uint32_t* stretcher = (uint32_t*)sdlStretcher; uint32_t* stretcher = (uint32_t*)sdlStretcher;
@ -682,3 +487,132 @@ void sdlStretch4x(uint8_t* srcPtr, uint32_t srcPitch, uint8_t* /* deltaPtr */, u
dstPtr += dstPitch; dstPtr += dstPitch;
} }
} }
} // namespace
struct FilterDesc {
char name[30];
int enlargeFactor;
FilterFunc func16;
FilterFunc func24;
FilterFunc func32;
};
const FilterDesc Filters[] = {{"Stretch 1x", 1, sdlStretch1x, sdlStretch1x, sdlStretch1x},
{"Stretch 2x", 2, sdlStretch2x, sdlStretch2x, sdlStretch2x},
{"2xSaI", 2, _2xSaI, 0, _2xSaI32},
{"Super 2xSaI", 2, Super2xSaI, 0, Super2xSaI32},
{"Super Eagle", 2, SuperEagle, 0, SuperEagle32},
{"Pixelate", 2, Pixelate, 0, Pixelate32},
{"AdvanceMAME Scale2x", 2, AdMame2x, 0, AdMame2x32},
{"Bilinear", 2, Bilinear, 0, Bilinear32},
{"Bilinear Plus", 2, BilinearPlus, 0, BilinearPlus32},
{"Scanlines", 2, Scanlines, 0, Scanlines32},
{"TV Mode", 2, ScanlinesTV, 0, ScanlinesTV32},
{"lq2x", 2, lq2x, 0, lq2x32},
{"hq2x", 2, hq2x, 0, hq2x32},
{"xbrz2x", 2, 0, 0, xbrz2x32},
{"Stretch 3x", 3, sdlStretch3x, sdlStretch3x, sdlStretch3x},
{"hq3x", 3, hq3x16, 0, hq3x32_32},
{"xbrz3x", 3, 0, 0, xbrz3x32},
{"Stretch 4x", 4, sdlStretch4x, sdlStretch4x, sdlStretch4x},
{"hq4x", 4, hq4x16, 0, hq4x32_32},
{"xbrz4x", 4, 0, 0, xbrz4x32},
{"xbrz5x", 5, 0, 0, xbrz5x32},
{"xbrz6x", 6, 0, 0, xbrz6x32}};
int getFilterEnlargeFactor(const int f) {
return Filters[f].enlargeFactor;
}
char* getFilterName(const int f) {
return (char*)Filters[f].name;
}
FilterFunc initFilter(const int f, const int colorDepth, const int srcWidth) {
FilterFunc func;
switch (colorDepth) {
case 15:
case 16:
func = Filters[f].func16;
break;
case 24:
func = Filters[f].func24;
break;
case 32:
func = Filters[f].func32;
break;
default:
func = 0;
break;
}
if (func)
switch (f) {
case kStretch1x:
sdlStretchInit(colorDepth, 0, srcWidth);
break;
case kStretch2x:
sdlStretchInit(colorDepth, 1, srcWidth);
break;
case kStretch3x:
sdlStretchInit(colorDepth, 2, srcWidth);
break;
case kStretch4x:
sdlStretchInit(colorDepth, 3, srcWidth);
break;
case k2xSaI:
case kSuper2xSaI:
case kSuperEagle:
if (colorDepth == 15)
Init_2xSaI(555);
else if (colorDepth == 16)
Init_2xSaI(565);
else
Init_2xSaI(colorDepth);
break;
case khq2x:
case klq2x:
hq2x_init(colorDepth);
break;
default:
break;
}
return func;
}
struct IFBFilterDesc {
char name[30];
IFBFilterFunc func16;
IFBFilterFunc func32;
};
const IFBFilterDesc IFBFilters[] = {{"No interframe blending", 0, 0},
{"Interframe motion blur", MotionBlurIB, MotionBlurIB32},
{"Smart interframe blending", SmartIB, SmartIB32}};
IFBFilterFunc initIFBFilter(const int f, const int colorDepth) {
IFBFilterFunc func;
switch (colorDepth) {
case 15:
case 16:
func = IFBFilters[f].func16;
break;
case 32:
func = IFBFilters[f].func32;
break;
case 24:
default:
func = 0;
break;
}
return func;
}
char* getIFBFilterName(const IFBFilter f) {
return (char*)IFBFilters[f].name;
}

View File

@ -763,8 +763,6 @@ set(
widgets/sdljoy.cpp widgets/sdljoy.cpp
widgets/user-input-ctrl.cpp widgets/user-input-ctrl.cpp
widgets/wxmisc.cpp widgets/wxmisc.cpp
# probably ought to be in common
../sdl/text.cpp
# from external source with minor modifications # from external source with minor modifications
widgets/checkedlistctrl.cpp widgets/checkedlistctrl.cpp
) )
@ -786,7 +784,6 @@ set(
background-input.h background-input.h
wxlogdebug.h wxlogdebug.h
drawing.h drawing.h
filters.h
ioregs.h ioregs.h
opts.h opts.h
viewsupt.h viewsupt.h
@ -819,8 +816,6 @@ set(
widgets/wx/sdljoy.h widgets/wx/sdljoy.h
widgets/wx/webupdatedef.h widgets/wx/webupdatedef.h
widgets/wx/wxmisc.h widgets/wx/wxmisc.h
# probably ought to be in common
../sdl/text.h
# from external source with minor modifications # from external source with minor modifications
widgets/wx/checkedlistctrl.h widgets/wx/checkedlistctrl.h
) )
@ -924,6 +919,8 @@ if(NOT TRANSLATIONS_ONLY)
${CM_STUFF} ${CM_STUFF}
) )
target_include_directories(visualboyadvance-m PRIVATE ${NONSTD_INCLUDE_DIR})
if(WIN32 AND (X86_64 OR X86_32) AND ENABLE_ONLINEUPDATES) if(WIN32 AND (X86_64 OR X86_32) AND ENABLE_ONLINEUPDATES)
if(NOT DEFINED WINSPARKLE_BIN_RELEASE_DIR) if(NOT DEFINED WINSPARKLE_BIN_RELEASE_DIR)
set(WINSPARKLE_BIN_RELEASE_DIR ${CMAKE_SOURCE_DIR}/dependencies/WinSparkle-0.6.0) set(WINSPARKLE_BIN_RELEASE_DIR ${CMAKE_SOURCE_DIR}/dependencies/WinSparkle-0.6.0)
@ -987,11 +984,19 @@ if(NOT TRANSLATIONS_ONLY)
visualboyadvance-m visualboyadvance-m
${wxWidgets_LIBRARIES} ${wxWidgets_LIBRARIES}
${VBAM_LIBS} ${VBAM_LIBS}
nonstd-lib
vbam-components-audio-sdl
vbam-components-draw-text
vbam-components-filters
vbam-components-filters-agb
vbam-components-filters-interframe
vbam-components-user-config
) )
if(ENABLE_FFMPEG) if(ENABLE_FFMPEG)
target_link_libraries( target_link_libraries(
visualboyadvance-m visualboyadvance-m
vbam-components-av-recording
${FFMPEG_LIBRARIES} ${FFMPEG_LIBRARIES}
) )

View File

@ -10,6 +10,7 @@
#include <wx/wfstream.h> #include <wx/wfstream.h>
#include <wx/msgdlg.h> #include <wx/msgdlg.h>
#include "components/filters_interframe/interframe.h"
#include "config/option-proxy.h" #include "config/option-proxy.h"
#include "config/option.h" #include "config/option.h"
#include "core/base/version.h" #include "core/base/version.h"

View File

@ -3,8 +3,10 @@
#include <array> #include <array>
#include <map> #include <map>
#include "nonstd/optional.hpp"
#include <set> #include <set>
#include <optional.hpp>
#include <wx/string.h> #include <wx/string.h>
#include "config/user-input.h" #include "config/user-input.h"

View File

@ -2,12 +2,13 @@
#error "Do not include "config/internal/option-internal.h" outside of the implementation." #error "Do not include "config/internal/option-internal.h" outside of the implementation."
#endif #endif
#include <wx/string.h>
#include <array> #include <array>
#include <string>
#include <optional.hpp>
#include <wx/string.h>
#include "config/option.h" #include "config/option.h"
#include "nonstd/optional.hpp"
namespace config { namespace config {
namespace internal { namespace internal {

View File

@ -1,7 +1,8 @@
#include "config/option.h" #include "config/option.h"
#include <cstring> #include <cstring>
#include "nonstd/variant.hpp"
#include <variant.hpp>
#include <wx/log.h> #include <wx/log.h>
#include <wx/translation.h> #include <wx/translation.h>

View File

@ -1,13 +1,12 @@
#ifndef VBAM_WX_CONFIG_OPTIONS_H_ #ifndef VBAM_WX_CONFIG_OPTIONS_H_
#define VBAM_WX_CONFIG_OPTIONS_H_ #define VBAM_WX_CONFIG_OPTIONS_H_
#include "nonstd/variant.hpp"
#include <array> #include <array>
#include <cstdint> #include <cstdint>
#include <functional>
#include <unordered_set> #include <unordered_set>
#include <variant.hpp>
#include <wx/string.h> #include <wx/string.h>
#include "config/option-id.h" #include "config/option-id.h"

View File

@ -32,7 +32,6 @@
#include <wx/valtext.h> #include <wx/valtext.h>
#include <wx/wfstream.h> #include <wx/wfstream.h>
#include "../Util.h"
#include "config/option-proxy.h" #include "config/option-proxy.h"
#include "core/gb/gb.h" #include "core/gb/gb.h"
#include "core/gb/gbCheats.h" #include "core/gb/gbCheats.h"
@ -1458,7 +1457,7 @@ public:
{ {
(void)ev; // unused params (void)ev; // unused params
uint32_t sz = wxGetApp().frame->GetPanel()->game_size(); uint32_t sz = wxGetApp().frame->GetPanel()->game_size();
utilGBAFindSave(sz); flashDetectSaveType(sz);
type->SetSelection(coreOptions.saveType); type->SetSelection(coreOptions.saveType);
if (coreOptions.saveType == GBA_SAVE_FLASH) { if (coreOptions.saveType == GBA_SAVE_FLASH) {

View File

@ -1,6 +1,8 @@
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>
#include "components/filters_agb/filters_agb.h"
#include "components/filters_interframe/interframe.h"
#ifdef __WXGTK__ #ifdef __WXGTK__
#include <X11/Xlib.h> #include <X11/Xlib.h>
@ -20,9 +22,9 @@
#include <wx/menu.h> #include <wx/menu.h>
#include <SDL_joystick.h> #include <SDL_joystick.h>
#include "../Util.h"
#include "../sdl/text.h"
#include "background-input.h" #include "background-input.h"
#include "components/draw_text/draw_text.h"
#include "components/filters/filters.h"
#include "config/game-control.h" #include "config/game-control.h"
#include "config/option-proxy.h" #include "config/option-proxy.h"
#include "config/option.h" #include "config/option.h"
@ -33,16 +35,15 @@
#include "core/gb/gb.h" #include "core/gb/gb.h"
#include "core/gb/gbCheats.h" #include "core/gb/gbCheats.h"
#include "core/gb/gbGlobals.h" #include "core/gb/gbGlobals.h"
#include "core/gb/gbSound.h"
#include "core/gb/gbPrinter.h" #include "core/gb/gbPrinter.h"
#include "core/gb/gbSound.h"
#include "core/gba/gbaCheats.h" #include "core/gba/gbaCheats.h"
#include "core/gba/gbaGlobals.h"
#include "core/gba/gbaFlash.h" #include "core/gba/gbaFlash.h"
#include "core/gba/gbaGlobals.h"
#include "core/gba/gbaPrint.h" #include "core/gba/gbaPrint.h"
#include "core/gba/gbaRtc.h" #include "core/gba/gbaRtc.h"
#include "core/gba/gbaSound.h" #include "core/gba/gbaSound.h"
#include "drawing.h" #include "drawing.h"
#include "filters.h"
#include "wayland.h" #include "wayland.h"
#include "widgets/render-plugin.h" #include "widgets/render-plugin.h"
#include "wxutil.h" #include "wxutil.h"
@ -354,7 +355,7 @@ void GameArea::LoadGame(const wxString& name)
ovSaveType = 0; ovSaveType = 0;
if (ovSaveType == 0) if (ovSaveType == 0)
utilGBAFindSave(rom_size); flashDetectSaveType(rom_size);
else else
coreOptions.saveType = ovSaveType; coreOptions.saveType = ovSaveType;
@ -368,7 +369,7 @@ void GameArea::LoadGame(const wxString& name)
coreOptions.cpuSaveType = 0; coreOptions.cpuSaveType = 0;
if (coreOptions.cpuSaveType == 0) if (coreOptions.cpuSaveType == 0)
utilGBAFindSave(rom_size); flashDetectSaveType(rom_size);
else else
coreOptions.saveType = coreOptions.cpuSaveType; coreOptions.saveType = coreOptions.cpuSaveType;
@ -2680,11 +2681,11 @@ void GameArea::OnGBBorderChanged(config::Option* option) {
void GameArea::UpdateLcdFilter() { void GameArea::UpdateLcdFilter() {
if (loaded == IMAGE_GBA) if (loaded == IMAGE_GBA)
utilUpdateSystemColorMaps(OPTION(kGBALCDFilter)); gbafilter_update_colors(OPTION(kGBALCDFilter));
else if (loaded == IMAGE_GB) else if (loaded == IMAGE_GB)
utilUpdateSystemColorMaps(OPTION(kGBLCDFilter)); gbafilter_update_colors(OPTION(kGBLCDFilter));
else else
utilUpdateSystemColorMaps(false); gbafilter_update_colors(false);
} }
void GameArea::SuspendScreenSaver() { void GameArea::SuspendScreenSaver() {

View File

@ -6,7 +6,7 @@
#include <wx/printdlg.h> #include <wx/printdlg.h>
#include <SDL.h> #include <SDL.h>
#include "../common/SoundSDL.h" #include "components/audio_sdl/audio_sdl.h"
#include "config/game-control.h" #include "config/game-control.h"
#include "config/option-proxy.h" #include "config/option-proxy.h"
#include "core/base/image_util.h" #include "core/base/image_util.h"

View File

@ -12,7 +12,8 @@ function(add_doctest_test test_src)
target_link_libraries("${test_name}" ${wxWidgets_LIBRARIES}) target_link_libraries("${test_name}" ${wxWidgets_LIBRARIES})
target_include_directories("${test_name}" PRIVATE ${wxWidgets_INCLUDE_DIRS}) target_include_directories("${test_name}"
PRIVATE ${wxWidgets_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/third_party/include)
set_target_properties("${test_name}" set_target_properties("${test_name}"
PROPERTIES PROPERTIES

View File

@ -30,6 +30,7 @@
#include <wx/wxcrtvararg.h> #include <wx/wxcrtvararg.h>
#include <wx/zipstrm.h> #include <wx/zipstrm.h>
#include "components/user_config/user_config.h"
#include "core/gb/gbGlobals.h" #include "core/gb/gbGlobals.h"
#include "core/gba/gbaSound.h" #include "core/gba/gbaSound.h"
@ -42,7 +43,6 @@
// The built-in vba-over.ini // The built-in vba-over.ini
#include "builtin-over.h" #include "builtin-over.h"
#include "../Util.h"
#include "config/game-control.h" #include "config/game-control.h"
#include "config/option-proxy.h" #include "config/option-proxy.h"
#include "config/option.h" #include "config/option.h"
@ -223,7 +223,7 @@ static void get_config_path(wxPathList& path, bool exists = true)
#if defined(__WXGTK__) #if defined(__WXGTK__)
// XDG spec manual support // XDG spec manual support
// ${XDG_CONFIG_HOME:-$HOME/.config}/`appname` // ${XDG_CONFIG_HOME:-$HOME/.config}/`appname`
wxString old_config = wxString(getenv("HOME"), wxConvLibc) + wxT(FILE_SEP) + wxT(".vbam"); wxString old_config = wxString(getenv("HOME"), wxConvLibc) + kFileSep + ".vbam";
wxString new_config(get_xdg_user_config_home().c_str(), wxConvLibc); wxString new_config(get_xdg_user_config_home().c_str(), wxConvLibc);
if (!wxDirExists(old_config) && wxIsWritable(new_config)) if (!wxDirExists(old_config) && wxIsWritable(new_config))
{ {

View File

@ -24,7 +24,7 @@
#endif #endif
#ifndef NO_FFMPEG #ifndef NO_FFMPEG
#include "../common/ffmpeg.h" #include "components/av_recording/av_recording.h"
#endif #endif
#include "wxlogdebug.h" #include "wxlogdebug.h"
@ -797,6 +797,4 @@ extern int autofire, autohold;
#define KEYM_MOTION_IN (1 << 19) #define KEYM_MOTION_IN (1 << 19)
#define KEYM_MOTION_OUT (1 << 20) #define KEYM_MOTION_OUT (1 << 20)
#include "filters.h"
#endif /* WX_WXVBAM_H */ #endif /* WX_WXVBAM_H */

View File

@ -0,0 +1,25 @@
# Defines the `NONSTD_INCLUDE_DIR` variable and `nonstd-lib` target.
# nonstd library dependency (header-only).
set(NONSTD_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR} PARENT_SCOPE)
add_library(nonstd-lib INTERFACE)
target_sources(nonstd-lib
INTERFACE
optional.hpp
variant.hpp
)
# For C++, default to nonstd::optional and nonstd::variant for now due to mac
# build issues.
if(APPLE)
target_compile_definitions(nonstd-lib
INTERFACE
optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_NONSTD
variant_CONFIG_SELECT_VARIANT=variant_VARIANT_NONSTD
)
else()
target_compile_definitions(nonstd-lib
INTERFACE
optional_CONFIG_SELECT_OPTIONAL=optional_OPTIONAL_STD
variant_CONFIG_SELECT_VARIANT=variant_VARIANT_STD
)
endif()