11#define CONFIG_SCALING_FIT_TOKENS(X) \
12 X("letterbox", DTTR_SCALING_MODE_LETTERBOX) \
13 X("stretch", DTTR_SCALING_MODE_STRETCH) \
14 X("integer", DTTR_SCALING_MODE_INTEGER)
16#define CONFIG_SCALING_METHOD_TOKENS(X) \
17 X("present", DTTR_SCALING_METHOD_PRESENT) \
18 X("logical", DTTR_SCALING_METHOD_LOGICAL)
20#define CONFIG_GRAPHICS_API_FORMAT_TOKENS(X) \
21 X(DTTR_DRIVER_AUTO, DTTR_GRAPHICS_API_AUTO) \
22 X(DTTR_DRIVER_VULKAN, DTTR_GRAPHICS_API_VULKAN) \
23 X(DTTR_DRIVER_DIRECT3D12, DTTR_GRAPHICS_API_DIRECT3D12) \
24 X(DTTR_DRIVER_OPENGL, DTTR_GRAPHICS_API_OPENGL)
26#define CONFIG_PRESENT_FILTER_TOKENS(X) \
27 X("nearest", SDL_GPU_FILTER_NEAREST) \
28 X("linear", SDL_GPU_FILTER_LINEAR)
30#define CONFIG_GAMEPAD_MISC_SOURCE_TOKENS(X) \
31 X("misc1", SDL_GAMEPAD_BUTTON_MISC1) \
32 X("misc2", SDL_GAMEPAD_BUTTON_MISC2) \
33 X("misc3", SDL_GAMEPAD_BUTTON_MISC3) \
34 X("misc4", SDL_GAMEPAD_BUTTON_MISC4) \
35 X("misc5", SDL_GAMEPAD_BUTTON_MISC5) \
36 X("misc6", SDL_GAMEPAD_BUTTON_MISC6)
38#define CONFIG_GAMEPAD_PADDLE_SOURCE_TOKENS(X) \
39 X("right_paddle1", SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1) \
40 X("left_paddle1", SDL_GAMEPAD_BUTTON_LEFT_PADDLE1) \
41 X("right_paddle2", SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2) \
42 X("left_paddle2", SDL_GAMEPAD_BUTTON_LEFT_PADDLE2)
44#define CONFIG_GAMEPAD_SOURCE_TOKENS(X) \
45 X("south", SDL_GAMEPAD_BUTTON_SOUTH) \
46 X("east", SDL_GAMEPAD_BUTTON_EAST) \
47 X("west", SDL_GAMEPAD_BUTTON_WEST) \
48 X("north", SDL_GAMEPAD_BUTTON_NORTH) \
49 X("back", SDL_GAMEPAD_BUTTON_BACK) \
50 X("guide", SDL_GAMEPAD_BUTTON_GUIDE) \
51 X("start", SDL_GAMEPAD_BUTTON_START) \
52 X("left_stick_click", SDL_GAMEPAD_BUTTON_LEFT_STICK) \
53 X("right_stick_click", SDL_GAMEPAD_BUTTON_RIGHT_STICK) \
54 X("left_shoulder", SDL_GAMEPAD_BUTTON_LEFT_SHOULDER) \
55 X("right_shoulder", SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER) \
56 X("dpad_up", SDL_GAMEPAD_BUTTON_DPAD_UP) \
57 X("dpad_down", SDL_GAMEPAD_BUTTON_DPAD_DOWN) \
58 X("dpad_left", SDL_GAMEPAD_BUTTON_DPAD_LEFT) \
59 X("dpad_right", SDL_GAMEPAD_BUTTON_DPAD_RIGHT) \
60 CONFIG_GAMEPAD_MISC_SOURCE_TOKENS(X) \
61 CONFIG_GAMEPAD_PADDLE_SOURCE_TOKENS(X) \
62 X("touchpad", SDL_GAMEPAD_BUTTON_TOUCHPAD) \
63 X("left_trigger", DTTR_GAMEPAD_SOURCE_TRIGGER_LEFT) \
64 X("right_trigger", DTTR_GAMEPAD_SOURCE_TRIGGER_RIGHT)
66#define CONFIG_GAME_ACTION_TOKENS(X) \
67 X("none", DTTR_GAMEPAD_MAPPING_NONE) \
68 X("up", PCDOGS_GAMEPAD_IDX_UP) \
69 X("down", PCDOGS_GAMEPAD_IDX_DOWN) \
70 X("left", PCDOGS_GAMEPAD_IDX_LEFT) \
71 X("right", PCDOGS_GAMEPAD_IDX_RIGHT) \
72 X("pov_up", PCDOGS_GAMEPAD_IDX_POV_UP) \
73 X("pov_down", PCDOGS_GAMEPAD_IDX_POV_DOWN) \
74 X("joy_1", PCDOGS_GAMEPAD_IDX_BTN_0) \
75 X("joy_2", PCDOGS_GAMEPAD_IDX_BTN_1) \
76 X("joy_3", PCDOGS_GAMEPAD_IDX_BTN_2) \
77 X("joy_4", PCDOGS_GAMEPAD_IDX_BTN_3) \
78 X("joy_5", PCDOGS_GAMEPAD_IDX_BTN_4) \
79 X("joy_6", PCDOGS_GAMEPAD_IDX_BTN_5) \
80 X("joy_7", PCDOGS_GAMEPAD_IDX_BTN_6) \
81 X("joy_8", PCDOGS_GAMEPAD_IDX_BTN_7) \
82 X("joy_9", PCDOGS_GAMEPAD_IDX_BTN_8) \
83 X("joy_10", PCDOGS_GAMEPAD_IDX_BTN_9) \
84 X("joy_11", PCDOGS_GAMEPAD_IDX_BTN_10) \
85 X("joy_12", PCDOGS_GAMEPAD_IDX_BTN_11) \
86 X("joy_13", PCDOGS_GAMEPAD_IDX_BTN_12)
88#define CONFIG_GAMEPAD_AXIS_TOKENS(X) \
89 X("none", DTTR_GAMEPAD_MAPPING_NONE) \
90 X("axis_left_x", SDL_GAMEPAD_AXIS_LEFTX) \
91 X("axis_left_y", SDL_GAMEPAD_AXIS_LEFTY) \
92 X("axis_right_x", SDL_GAMEPAD_AXIS_RIGHTX) \
93 X("axis_right_y", SDL_GAMEPAD_AXIS_RIGHTY) \
94 X("axis_left_trigger", SDL_GAMEPAD_AXIS_LEFT_TRIGGER) \
95 X("axis_right_trigger", SDL_GAMEPAD_AXIS_RIGHT_TRIGGER)
97#define CONFIG_LOG_LEVEL_TOKENS(X) \
98 X("trace", LOG_TRACE) \
99 X("debug", LOG_DEBUG) \
100 X("info", LOG_INFO) \
101 X("warn", LOG_WARN) \
102 X("error", LOG_ERROR) \
103 X("fatal", LOG_FATAL)
105#define CONFIG_MINIDUMP_TYPE_TOKENS(X) \
106 X("normal", DTTR_MINIDUMP_NORMAL) \
107 X("detailed", DTTR_MINIDUMP_DETAILED)
109#define CONFIG_VERTEX_PRECISION_TOKENS(X) \
110 X("native", DTTR_VERTEX_PRECISION_NATIVE) \
111 X("subpixel", DTTR_VERTEX_PRECISION_SUBPIXEL)
113#define CONFIG_CHOICE(token, enum_value) {(token), (int)(enum_value)},
158#define CONFIG_CHOICE_LIST_DATA(array) {(array), (int)SDL_arraysize(array)}
188#undef CONFIG_CHOICE_LIST_DATA
205 if (!
data || index < 0 || index >=
data->count) {
209 return &
data->choices[index];
228 if (!value || !out_value || !choices) {
232 for (
int i = 0; i <
count; i++) {
233 if (strcmp(value, choices[i].label) == 0) {
234 *out_value = choices[i].
value;
243 if (!value || !out_value) {
247 if (strcmp(value,
"true") == 0) {
252 if (strcmp(value,
"false") == 0) {
260#define CONFIG_PARSE_CHOICE_FN(fn_name, type, choice_list) \
261 bool fn_name(const char *value, type *out_value) { \
263 if (!out_value || !config_parse_choice(choice_list, value, &parsed)) { \
266 *out_value = (type)parsed; \
305#define CONFIG_PARSE_TOKEN(token, enum_value) \
306 if (strcmp(value, token) == 0) { \
307 *out_value = enum_value; \
312 if (!value || !out_value) {
320#undef CONFIG_PARSE_TOKEN
345#undef CONFIG_PARSE_CHOICE_FN
348 if (!value || !out_value) {
355 const long parsed = strtol(value, &end, 10);
357 if (errno != 0 || !end || *end !=
'\0') {
361 if (parsed < INT_MIN || parsed > INT_MAX) {
365 *out_value = (int)parsed;
370 if (!value || !out_value) {
377 const float parsed = strtof(value, &end);
378 if (errno != 0 || !end || *end !=
'\0' || !isfinite(parsed)) {
387 if (!value || !out_value || out_size == 0) {
391 const size_t value_len = strlen(value);
392 if (value_len >= out_size) {
396 memcpy(out_value, value, value_len + 1);
400#define CONFIG_FORMAT_TOKEN(token, enum_value) \
405 snprintf(buf, buf_size,
"%d", value);
409 snprintf(buf, buf_size,
"%.9g", value);
412#define CONFIG_FORMAT_FN(fn_name, type, arg_name, token_list, default_token) \
413 const char *fn_name(type arg_name) { \
414 switch (arg_name) { \
415 token_list(CONFIG_FORMAT_TOKEN) default : return (default_token); \
472#undef CONFIG_FORMAT_FN
473#undef CONFIG_FORMAT_TOKEN
DTTR_Graphics_COM_Direct3DDevice7 void DWORD flags DWORD count
const DTTR_PrimitiveType type
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void DTTR_Graphics_COM_DirectDrawSurface7 *self DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags DTTR_Graphics_COM_DirectDrawSurface7 void void * data
DTTR_Graphics_COM_DirectDrawSurface7 DWORD flags void NULL
bool config_parse_scaling_fit(const char *value, DTTR_ScalingMode *out_value)
const char * config_format_graphics_api(DTTR_GraphicsApi api)
const char * config_format_vertex_precision(DTTR_VertexPrecision precision)
bool config_parse_scaling_method(const char *value, DTTR_ScalingMethod *out_value)
bool config_parse_present_filter(const char *value, SDL_GPUFilter *out_value)
const char * config_format_scaling_fit(DTTR_ScalingMode mode)
bool config_parse_minidump_type(const char *value, DTTR_MinidumpType *out_value)
bool config_parse_graphics_api(const char *value, DTTR_GraphicsApi *out_value)
bool config_parse_int(const char *value, int *out_value)
const char * config_format_minidump_type(DTTR_MinidumpType type)
const char * config_format_present_filter(SDL_GPUFilter filter)
const char * config_format_gamepad_axis(int axis)
const char * config_format_game_action(int action)
const char * config_format_gamepad_source(int source)
bool config_parse_vertex_precision(const char *value, DTTR_VertexPrecision *out_value)
const char * config_format_scaling_method(DTTR_ScalingMethod method)
const char * config_format_log_level(int level)
@ DTTR_GRAPHICS_API_DIRECT3D12
#define DTTR_DRIVER_DIRECT3D12_SHORT
@ DTTR_CONFIG_CHOICES_MINIDUMP_TYPE
@ DTTR_CONFIG_CHOICES_GAMEPAD_AXIS
@ DTTR_CONFIG_CHOICES_GRAPHICS_API
@ DTTR_CONFIG_CHOICES_LOG_LEVEL
@ DTTR_CONFIG_CHOICES_SCALING_FIT
@ DTTR_CONFIG_CHOICES_SCALING_METHOD
@ DTTR_CONFIG_CHOICES_PRESENT_FILTER
@ DTTR_CONFIG_CHOICES_GAME_ACTION
@ DTTR_CONFIG_CHOICES_VERTEX_PRECISION
static game_data_source source
bool config_parse_float(const char *value, float *out_value)
static const config_choice_list_data * config_choice_list(DTTR_ConfigChoiceList list)
bool config_parse_game_action(const char *value, int *out_value)
bool config_parse_string(const char *value, char *out_value, size_t out_size)
#define CONFIG_GAME_ACTION_TOKENS(X)
static const DTTR_ConfigChoice CONFIG_LOG_LEVEL_CHOICES[]
#define CONFIG_CHOICE(token, enum_value)
#define CONFIG_FORMAT_FN(fn_name, type, arg_name, token_list, default_token)
static const DTTR_ConfigChoice CONFIG_GAMEPAD_AXIS_CHOICES[]
#define CONFIG_CHOICE_LIST_DATA(array)
static bool config_parse_choice(DTTR_ConfigChoiceList list, const char *value, int *out_value)
static const DTTR_ConfigChoice CONFIG_VERTEX_PRECISION_CHOICES[]
#define CONFIG_MINIDUMP_TYPE_TOKENS(X)
void config_format_int(int value, char *buf, size_t buf_size)
static const DTTR_ConfigChoice CONFIG_MINIDUMP_TYPE_CHOICES[]
#define CONFIG_PARSE_TOKEN(token, enum_value)
#define CONFIG_LOG_LEVEL_TOKENS(X)
static const DTTR_ConfigChoice CONFIG_SCALING_FIT_CHOICES[]
#define CONFIG_SCALING_FIT_TOKENS(X)
bool config_parse_bool(const char *value, bool *out_value)
static const DTTR_ConfigChoice CONFIG_GRAPHICS_API_CHOICES[]
const DTTR_ConfigChoice * DTTR_Config_Choices(DTTR_ConfigChoiceList list, int *count)
#define CONFIG_GAMEPAD_SOURCE_TOKENS(X)
static const DTTR_ConfigChoice CONFIG_SCALING_METHOD_CHOICES[]
const DTTR_ConfigChoice * DTTR_Config_ChoiceGet(DTTR_ConfigChoiceList list, int index)
#define CONFIG_GAMEPAD_AXIS_TOKENS(X)
static const DTTR_ConfigChoice CONFIG_GAME_ACTION_CHOICES[]
bool config_parse_log_level(const char *value, int *out_value)
#define CONFIG_PARSE_CHOICE_FN(fn_name, type, choice_list)
#define CONFIG_SCALING_METHOD_TOKENS(X)
static const config_choice_list_data CONFIG_CHOICE_LISTS[]
static const DTTR_ConfigChoice CONFIG_PRESENT_FILTER_CHOICES[]
#define CONFIG_GRAPHICS_API_FORMAT_TOKENS(X)
#define CONFIG_PRESENT_FILTER_TOKENS(X)
bool config_parse_gamepad_axis(const char *value, int *out_value)
void config_format_float(float value, char *buf, size_t buf_size)
int DTTR_Config_ChoiceCount(DTTR_ConfigChoiceList list)
bool config_parse_gamepad_source(const char *value, int *out_value)
#define CONFIG_VERTEX_PRECISION_TOKENS(X)
const DTTR_ConfigChoice * choices