MXVK Vulkan Framework 0.35.0
C++20 Vulkan rendering framework for practical 2D and 3D application development with SDL3.
Loading...
Searching...
No Matches
argz.hpp File Reference

Lightweight, header-only, template command-line argument parser. More...

#include "mxvk_runtime_options.hpp"
#include <algorithm>
#include <cctype>
#include <charconv>
#include <cmath>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <filesystem>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <ranges>
#include <string>
#include <string_view>
#include <system_error>
#include <type_traits>
#include <unordered_map>
#include <utility>
#include <vector>
#include <unistd.h>

Go to the source code of this file.

Classes

class  ArgException< String >
 Exception thrown by Argz::proc() on unrecognised or malformed options. More...
struct  Argument< String >
 Describes a single parsed argument entry returned by Argz::proc(). More...
struct  ArgumentData< String >
 Holds the raw argv strings converted to the target String type. More...
struct  Arguments
 Plain data structure returned by proc_args() with all common libmx2 CLI options. More...
class  Argz< String >
 Template command-line argument parser. More...
struct  FramebufferDimensions
 Parsed software framebuffer dimensions. More...

Concepts

concept  StringType
 Models a string-like class with indexing, concatenation, length, and value_type.

Enumerations

enum class  ArgType {
  ARG_SINGLE , ARG_SINGLE_VALUE , ARG_DOUBLE , ARG_DOUBLE_VALUE ,
  ARG_NONE
}
 Discriminator for option kind used inside Argument. More...

Functions

std::string executable_directory (const char *executable)
double parse_arg_double (const std::string &text, const std::string &option_name)
int parse_arg_int (const std::string &text, const std::string &option_name)
std::string parse_executable_name (const char *argv0)
Arguments proc_args (int &argc, char **argv)
 Parse standard libmx2 command-line options from main()'s argv.

Detailed Description

Lightweight, header-only, template command-line argument parser.

Supports both short options (-x) and long options (--name), with or without values, for any string type that satisfies the StringType concept (typically std::string or std::wstring).

Typical usage:

Argz<std::string> parser(argc, argv);
parser.addOptionSingle('h', "Show help")
.addOptionSingleValue('o', "Output file");
int code;
while ((code = parser.proc(arg)) != -1) { ... }
Template command-line argument parser.
Definition argz.hpp:187
Describes a single parsed argument entry returned by Argz::proc().
Definition argz.hpp:113

A convenience wrapper proc_args() provides a pre-built parser that handles the options common to all libmx2 applications (-p path, -r resolution, -f fullscreen, …).

Definition in file argz.hpp.

Enumeration Type Documentation

◆ ArgType

enum class ArgType
strong

Discriminator for option kind used inside Argument.

Enumerator
ARG_SINGLE 
ARG_SINGLE_VALUE 
ARG_DOUBLE 
ARG_DOUBLE_VALUE 
ARG_NONE 

Definition at line 102 of file argz.hpp.

Function Documentation

◆ executable_directory()

std::string executable_directory ( const char * executable)
inlinenodiscard

Definition at line 78 of file argz.hpp.

78 {
79#if defined(_WIN32)
80 std::vector<char> buffer(32768);
81 const DWORD length = GetModuleFileNameA(nullptr, buffer.data(), static_cast<DWORD>(buffer.size()));
82 if (length > 0 && length < buffer.size()) {
83 return std::filesystem::path(std::string(buffer.data(), length)).parent_path().lexically_normal().string();
84 }
85#elif defined(__linux__)
86 std::vector<char> buffer(4096);
87 const ssize_t length = readlink("/proc/self/exe", buffer.data(), buffer.size());
88 if (length > 0 && static_cast<std::size_t>(length) < buffer.size()) {
89 return std::filesystem::path(std::string(buffer.data(), static_cast<std::size_t>(length))).parent_path().lexically_normal().string();
90 }
91#endif
92
93 std::error_code error;
94 const std::filesystem::path absolute_path = std::filesystem::absolute(executable == nullptr ? "." : executable, error);
95 if (!error && absolute_path.has_parent_path()) {
96 return absolute_path.parent_path().lexically_normal().string();
97 }
98 return ".";
99}

◆ parse_arg_double()

double parse_arg_double ( const std::string & text,
const std::string & option_name )
inlinenodiscard

Definition at line 773 of file argz.hpp.

773 {
774 double value = 0.0;
775 const char *begin = text.data();
776 const char *end = begin + text.size();
777 const std::from_chars_result result = std::from_chars(begin, end, value);
778 if (result.ec != std::errc{} || result.ptr != end || !std::isfinite(value)) {
779 throw ArgException<std::string>("Invalid numeric value for " + option_name + ": " + text);
780 }
781 return value;
782}
Exception thrown by Argz::proc() on unrecognised or malformed options.
Definition argz.hpp:169

◆ parse_arg_int()

int parse_arg_int ( const std::string & text,
const std::string & option_name )
inlinenodiscard

Definition at line 762 of file argz.hpp.

762 {
763 int value = 0;
764 const char *begin = text.data();
765 const char *end = begin + text.size();
766 const std::from_chars_result result = std::from_chars(begin, end, value);
767 if (result.ec != std::errc{} || result.ptr != end) {
768 throw ArgException<std::string>("Invalid numeric value for " + option_name + ": " + text);
769 }
770 return value;
771}

◆ parse_executable_name()

std::string parse_executable_name ( const char * argv0)
inlinenodiscard

Definition at line 784 of file argz.hpp.

784 {
785 if (argv0 == nullptr || argv0[0] == '\0') {
786 return "mxvk";
787 }
788
789 std::string name = argv0;
790 const std::string::size_type separator = name.find_last_of("/\\");
791 if (separator != std::string::npos) {
792 name.erase(0, separator + 1);
793 }
794
795 constexpr std::string_view exe_extension = ".exe";
796 if (name.size() >= exe_extension.size()) {
797 const std::string::size_type extension_pos = name.size() - exe_extension.size();
798 const bool has_exe_extension = std::ranges::equal(name.begin() + static_cast<std::ptrdiff_t>(extension_pos), name.end(), exe_extension.begin(), exe_extension.end(), [](char left, char right) { return std::tolower(static_cast<unsigned char>(left)) == std::tolower(static_cast<unsigned char>(right)); });
799 if (has_exe_extension) {
800 name.erase(extension_pos);
801 }
802 }
803
804 return name.empty() ? "mxvk" : name;
805}

◆ proc_args()

Arguments proc_args ( int & argc,
char ** argv )
inline

Parse standard libmx2 command-line options from main()'s argv.

Registers and processes the following options:

Flag Long form Description
-h Print help and exit
-p –path Asset directory path
-r –resolution Resolution as WxH (e.g. 1920x1080)
-f –fullscreen Enable fullscreen
–fast Enable fast mode
–filename Input filename
–model Model filename
-o –output Output filename
-c –crf Constant Rate Factor
–encode-preset Encoder preset
–encode-tune Encoder tune
–encode-codec Encoder codec policy or name
–encode-realtime Enable realtime/low-latency encoding
–mxwrite-block Block MXWrite when its queue is full
–repeat Enable playback or texture repetition
–binary Use binary glyphs only
–enable-crt Enable CRT post-processing at startup
–enable-vsync Enable FIFO present mode / v-sync
–enable-screenshot Enable F10 screenshot capture
–disable-sound Disable application background music
–benchmark Enable application benchmark mode
–wireframe Render supported 3D models as wireframes
–nowarpfix Disable perspective-correct texture mapping
–disable-mipmap Disable mipmap generation and selection
–mip-bias Mipmap level-of-detail bias
–framebuffer Software framebuffer size as WxH
–fps Override capture FPS
-z –font-size Matrix rain font size
-j –font-path Matrix rain font file path
-C –color Matrix rain RGB tint (#RRGGBB or R,G,B)
–texture Texture file
–textures Texture file alias
-S –shader-path SPV shader folder (must contain index.txt)
–fragment Fragment shader SPV path
-i –index Acidcam filter mode index
–shader-index Initial shader entry index
Parameters
argcReference to argc from main().
argvargv from main().
Returns
Populated Arguments struct; on parse error, returns a default-valued struct.

Definition at line 854 of file argz.hpp.

854 {
855 Arguments args;
856 const std::string executable_name = parse_executable_name(argc > 0 ? argv[0] : nullptr);
857 Argz<std::string> parser(argc, argv);
858 parser.addOptionSingle('h', "Display help message")
859 .addOptionSingle('v', "Print version")
860 .addOptionSingleValue('p', "assets path")
861 .addOptionDoubleValue('P', "path", "assets path")
862 .addOptionSingleValue('r', "Resolution WidthxHeight")
863 .addOptionDoubleValue('R', "resolution", "Resolution WidthxHeight")
864 .addOptionSingle('f', "fullscreen")
865 .addOptionDouble('F', "fullscreen", "fullscreen")
866 .addOptionDouble(301, "fast", "fast")
867 .addOptionDoubleValue(256, "filename", "input filename")
868 .addOptionDoubleValue(324, "model", "model filename (.obj, .mxmod, or .mxmod.z)")
869 .addOptionSingleValue('o', "output filename")
870 .addOptionDoubleValue(304, "output", "output filename")
871 .addOptionSingleValue('c', "crf value")
872 .addOptionDoubleValue(305, "crf", "crf value")
873 .addOptionDoubleValue(306, "encode-preset", "encoder preset")
874 .addOptionDoubleValue(307, "encode-tune", "encoder tune")
875 .addOptionDoubleValue(308, "encode-codec", "encoder codec policy or name")
876 .addOptionDouble(309, "encode-realtime", "encoder realtime mode")
877 .addOptionDouble(314, "mxwrite-block", "block MXWrite when its queue is full")
878 .addOptionDouble(310, "repeat", "repeat playback or wrapped textures")
879 .addOptionDouble(315, "binary", "use binary glyphs only")
880 .addOptionDouble(319, "enable-crt", "enable CRT post-processing at startup")
881 .addOptionDouble(320, "enable-vsync", "enable FIFO present mode / v-sync")
882 .addOptionDouble(322, "enable-screenshot", "enable F10 screenshot capture")
883 .addOptionDouble(325, "disable-sound", "disable background music")
884 .addOptionDouble(330, "benchmark", "enable application benchmark mode")
885 .addOptionDouble(331, "wireframe", "render supported 3D models as wireframes")
886 .addOptionDouble(326, "nowarpfix", "3dmath - disable perspective-correct texture mapping")
887 .addOptionDoubleValue(327, "framebuffer", "3dmath - software framebuffer size WidthxHeight")
888 .addOptionDouble(328, "disable-mipmap", "3dmath - disable mipmap generation and selection")
889 .addOptionDoubleValue(329, "mip-bias", "3dmath - mipmap level-of-detail bias (-16 to 16)")
890 .addOptionDoubleValue(321, "fps", "capture FPS override")
891 .addOptionSingleValue('z', "matrix rain font size")
892 .addOptionDoubleValue(316, "font-size", "matrix rain font size")
893 .addOptionSingleValue('j', "matrix rain font file path")
894 .addOptionDoubleValue(317, "font-path", "matrix rain font file path")
895 .addOptionSingleValue('C', "matrix rain RGB tint (#RRGGBB or R,G,B)")
896 .addOptionDoubleValue(318, "color", "matrix rain RGB tint (#RRGGBB or R,G,B)")
897 .addOptionDoubleValue(302, "resource", "resource file")
898 .addOptionDoubleValue(303, "resource_path", "resource data path")
899 .addOptionDoubleValue(257, "texture", "texture file (.png or .tex)")
900 .addOptionDoubleValue(323, "textures", "texture file (.png or .tex)")
901 .addOptionSingleValue('S', "shader SPV folder path (contains index.txt)")
902 .addOptionDoubleValue(258, "shader-path", "shader SPV folder path (contains index.txt)")
903 .addOptionDoubleValue(313, "fragment", "fragment shader SPV path")
904 .addOptionSingleValue('i', "acidcam filter mode index")
905 .addOptionDoubleValue(311, "index", "acidcam filter mode index")
906 .addOptionDoubleValue(312, "shader-index", "initial shader entry index")
907 .addOptionDoubleValue(300, "camera", "camera index");
908
910 std::string path;
911 int value = 0;
912 int tw = 1280, th = 720;
913 bool fullscreen = false;
914 bool fast = false;
915 bool resolutionSpecified = false;
916 std::string filename;
917 std::string model;
918 std::string output;
919 std::string crf;
920 std::string encodePreset;
921 std::string encodeTune;
922 std::string encodeCodec;
923 bool encodeRealtime = false;
924 bool mxwriteBlockWhenFull = false;
925 bool repeat = false;
926 bool binary = false;
927 bool enable_crt = false;
928 bool enable_vsync = false;
929 bool enable_screenshot = false;
930 bool disable_sound = false;
931 bool benchmark = false;
932 bool wireframe = false;
933 bool nowarpfix = false;
934 bool disable_mipmap = false;
935 float mip_bias = 0.0f;
936 FramebufferDimensions framebuffer;
937 bool framebufferSpecified = false;
938 double fps = 0.0;
939 int font_size = 22;
940 std::string font_path;
941 std::string color;
942 std::string texture;
943 std::string shaderPath;
944 std::string fragmentPath;
945 int camera_index = 0;
946 int index = 0;
947 int shader_index = 0;
948 std::string resource;
949 std::string resource_path;
950 while ((value = parser.proc(arg)) != -1) {
951 switch (value) {
952 case 303:
953 resource_path = arg.arg_value;
954 break;
955 case 302:
956 resource = arg.arg_value;
957 break;
958 case 256:
959 filename = arg.arg_value;
960 break;
961 case 324:
962 model = arg.arg_value;
963 break;
964 case 'o':
965 case 304:
966 output = arg.arg_value;
967 break;
968 case 'c':
969 case 305:
970 crf = arg.arg_value;
971 break;
972 case 306:
973 encodePreset = arg.arg_value;
974 break;
975 case 307:
976 encodeTune = arg.arg_value;
977 break;
978 case 308:
979 encodeCodec = arg.arg_value;
980 break;
981 case 309:
982 encodeRealtime = true;
983 break;
984 case 314:
985 mxwriteBlockWhenFull = true;
986 break;
987 case 310:
988 repeat = true;
989 break;
990 case 315:
991 binary = true;
992 break;
993 case 319:
994 enable_crt = true;
995 break;
996 case 320:
997 enable_vsync = true;
998 break;
999 case 322:
1000 enable_screenshot = true;
1001 break;
1002 case 325:
1003 disable_sound = true;
1004 break;
1005 case 330:
1006 benchmark = true;
1007 break;
1008 case 331:
1009 wireframe = true;
1010 break;
1011 case 326:
1012 nowarpfix = true;
1013 break;
1014 case 327: {
1015 const std::string::size_type separator = arg.arg_value.find('x');
1016 if (separator == std::string::npos) {
1017 throw ArgException<std::string>("Invalid framebuffer size, expected WidthxHeight: " + arg.arg_value);
1018 }
1019 framebuffer.width = parse_arg_int(arg.arg_value.substr(0, separator), "--framebuffer width");
1020 framebuffer.height = parse_arg_int(arg.arg_value.substr(separator + 1), "--framebuffer height");
1021 if (framebuffer.width <= 0 || framebuffer.height <= 0) {
1022 throw ArgException<std::string>("Invalid framebuffer size: " + arg.arg_value);
1023 }
1024 framebufferSpecified = true;
1025 } break;
1026 case 328:
1027 disable_mipmap = true;
1028 break;
1029 case 329: {
1030 const double parsed_mip_bias = parse_arg_double(arg.arg_value, "--mip-bias");
1031 if (parsed_mip_bias < -16.0 || parsed_mip_bias > 16.0) {
1032 throw ArgException<std::string>("Mip bias must be between -16 and 16: " + arg.arg_value);
1033 }
1034 mip_bias = static_cast<float>(parsed_mip_bias);
1035 } break;
1036 case 321:
1037 fps = parse_arg_double(arg.arg_value, "--fps");
1038 if (fps <= 0.0) {
1039 throw ArgException<std::string>("Invalid numeric value for --fps: " + arg.arg_value);
1040 }
1041 break;
1042 case 'z':
1043 case 316:
1044 font_size = parse_arg_int(arg.arg_value, "--font-size");
1045 if (font_size <= 0) {
1046 throw ArgException<std::string>("Invalid numeric value for --font-size: " + arg.arg_value);
1047 }
1048 break;
1049 case 'j':
1050 case 317:
1051 font_path = arg.arg_value;
1052 break;
1053 case 'C':
1054 case 318:
1055 color = arg.arg_value;
1056 break;
1057 case 257:
1058 case 323:
1059 texture = arg.arg_value;
1060 break;
1061 case 'S':
1062 case 258:
1063 shaderPath = arg.arg_value;
1064 break;
1065 case 313:
1066 fragmentPath = arg.arg_value;
1067 break;
1068 case 'h':
1069 case 'v':
1070 parser.help(std::cout);
1071 exit(EXIT_SUCCESS);
1072 break;
1073 case 'p':
1074 case 'P':
1075 path = arg.arg_value;
1076 break;
1077 case 'r':
1078 case 'R': {
1079 auto pos = arg.arg_value.find("x");
1080 if (pos == std::string::npos) {
1081 throw ArgException<std::string>("Invalid resolution for --resolution, expected WidthxHeight: " + arg.arg_value);
1082 }
1083 std::string left, right;
1084 left = arg.arg_value.substr(0, pos);
1085 right = arg.arg_value.substr(pos + 1);
1086 tw = parse_arg_int(left, "--resolution width");
1087 th = parse_arg_int(right, "--resolution height");
1088 if (tw <= 0 || th <= 0) {
1089 throw ArgException<std::string>("Invalid numeric value for --resolution: " + arg.arg_value);
1090 }
1091 resolutionSpecified = true;
1092 } break;
1093 case 'f':
1094 case 'F':
1095 fullscreen = true;
1096 break;
1097 case 301:
1098 fast = true;
1099 break;
1100 case 300:
1101 camera_index = parse_arg_int(arg.arg_value, "--camera");
1102 break;
1103 case 'i':
1104 case 311:
1105 index = parse_arg_int(arg.arg_value, "--index");
1106 break;
1107 case 312:
1108 shader_index = parse_arg_int(arg.arg_value, "--shader-index");
1109 break;
1110 }
1111 }
1112 if (path.empty()) {
1113 path = executable_directory(argc > 0 ? argv[0] : nullptr);
1114 std::cerr << "mx: No path provided; using executable directory: " << path << '\n';
1115 } else {
1116 std::error_code error;
1117 const std::filesystem::path absolute_path = std::filesystem::absolute(path, error);
1118 if (!error) {
1119 path = absolute_path.lexically_normal().string();
1120 }
1121 }
1122 args.executable_name = executable_name;
1123 mxvk::setDefaultExecutableName(executable_name);
1124 args.width = tw;
1125 args.height = th;
1126 args.resolutionSpecified = resolutionSpecified;
1127 args.path = path;
1128 args.fullscreen = fullscreen;
1129 args.fast = fast;
1130 args.filename = filename;
1131 args.model = model;
1132 args.output = output;
1133 args.crf = crf;
1134 args.encodePreset = encodePreset;
1135 args.encodeTune = encodeTune;
1136 args.encodeCodec = encodeCodec;
1137 args.encodeRealtime = encodeRealtime;
1138 args.mxwriteBlockWhenFull = mxwriteBlockWhenFull;
1139 args.repeat = repeat;
1140 args.binary = binary;
1141 args.enable_crt = enable_crt;
1142 args.enable_vsync = enable_vsync;
1143 args.enable_screenshot = enable_screenshot;
1144 args.disable_sound = disable_sound;
1145 args.benchmark = benchmark;
1146 args.wireframe = wireframe;
1147 args.nowarpfix = nowarpfix;
1148 args.disable_mipmap = disable_mipmap;
1149 args.mip_bias = mip_bias;
1150 args.framebuffer = framebuffer;
1151 args.framebufferSpecified = framebufferSpecified;
1152 mxvk::setDefaultEnableScreenshot(enable_screenshot);
1153 args.fps = fps;
1154 args.font_size = font_size;
1155 args.font_path = font_path;
1156 args.color = color;
1157 args.texture = texture;
1158 args.shaderPath = shaderPath;
1159 args.fragmentPath = fragmentPath;
1160 args.camera_index = camera_index;
1161 args.index = index;
1162 args.shader_index = shader_index;
1163 args.resource = resource;
1164 args.resource_path = resource_path;
1165 return args;
1166}
std::string executable_directory(const char *executable)
Definition argz.hpp:78
double parse_arg_double(const std::string &text, const std::string &option_name)
Definition argz.hpp:773
int parse_arg_int(const std::string &text, const std::string &option_name)
Definition argz.hpp:762
std::string parse_executable_name(const char *argv0)
Definition argz.hpp:784
Definition model.py:1
void setDefaultEnableScreenshot(bool enabled)
void setDefaultExecutableName(const std::string &name)
String arg_value
Value string supplied after the option, if any.
Definition argz.hpp:116
Plain data structure returned by proc_args() with all common libmx2 CLI options.
Definition argz.hpp:718
FramebufferDimensions framebuffer
Software framebuffer size requested by --framebuffer.
Definition argz.hpp:746
std::string shaderPath
Optional SPV shader folder path (-S / --shader-path).
Definition argz.hpp:753
bool framebufferSpecified
Whether --framebuffer was provided.
Definition argz.hpp:747
std::string output
Optional output filename (--output).
Definition argz.hpp:728
std::string font_path
Optional font file path (--font-path).
Definition argz.hpp:750
bool mxwriteBlockWhenFull
Make MXWrite block instead of dropping frames (--mxwrite-block).
Definition argz.hpp:734
bool fast
Whether fast mode was requested (--fast).
Definition argz.hpp:725
int camera_index
Optional camera index.
Definition argz.hpp:755
bool enable_screenshot
Enable F10 screenshot capture (--enable-screenshot).
Definition argz.hpp:739
std::string encodeTune
Optional encoder tune (--encode-tune).
Definition argz.hpp:731
bool fullscreen
Whether fullscreen mode was requested.
Definition argz.hpp:724
int index
Optional acidcam filter mode index.
Definition argz.hpp:756
bool encodeRealtime
Enable low-latency encoder settings (--encode-realtime).
Definition argz.hpp:733
bool resolutionSpecified
Whether -r/–resolution was provided.
Definition argz.hpp:722
float mip_bias
Mipmap level-of-detail bias requested by --mip-bias.
Definition argz.hpp:745
std::string model
Optional model filename (--model).
Definition argz.hpp:727
bool enable_vsync
Enable FIFO present mode / v-sync (--enable-vsync).
Definition argz.hpp:738
std::string crf
Optional CRF value (--crf).
Definition argz.hpp:729
bool nowarpfix
Disable perspective-correct texture mapping (--nowarpfix).
Definition argz.hpp:743
std::string texture
Optional texture file path (--texture).
Definition argz.hpp:752
int height
Viewport height in pixels (default: 720).
Definition argz.hpp:721
double fps
Optional FPS override (--fps); non-positive means unspecified.
Definition argz.hpp:748
std::string encodeCodec
Optional encoder codec policy/name (--encode-codec).
Definition argz.hpp:732
std::string color
Optional rain RGB tint (--color).
Definition argz.hpp:751
std::string resource_path
Resource path.
Definition argz.hpp:759
bool repeat
Enable repeat behavior such as playback looping or wrapped textures.
Definition argz.hpp:735
std::string filename
Optional input filename (--filename).
Definition argz.hpp:726
std::string encodePreset
Optional encoder preset (--encode-preset).
Definition argz.hpp:730
std::string path
Asset root; proc_args() defaults it to the executable directory.
Definition argz.hpp:723
std::string fragmentPath
Optional fragment shader SPV path (--fragment).
Definition argz.hpp:754
std::string executable_name
Executable basename derived from argv[0].
Definition argz.hpp:719
bool benchmark
Enable application benchmark mode (--benchmark).
Definition argz.hpp:741
bool wireframe
Render supported 3D models as wireframes (--wireframe).
Definition argz.hpp:742
int width
Viewport width in pixels (default: 1280).
Definition argz.hpp:720
std::string resource
Resource file.
Definition argz.hpp:758
bool enable_crt
Enable CRT post-processing at startup (--enable-crt).
Definition argz.hpp:737
int shader_index
Optional initial shader entry index.
Definition argz.hpp:757
bool disable_mipmap
Disable mipmap generation and selection (--disable-mipmap).
Definition argz.hpp:744
int font_size
Matrix rain font size in pixels (--font-size).
Definition argz.hpp:749
bool binary
Use binary glyphs only (--binary).
Definition argz.hpp:736
bool disable_sound
Disable application background music (--disable-sound).
Definition argz.hpp:740
Parsed software framebuffer dimensions.
Definition argz.hpp:709
int width
Software framebuffer width in pixels.
Definition argz.hpp:710
int height
Software framebuffer height in pixels.
Definition argz.hpp:711