diff options
Diffstat (limited to 'src/osd/modules/render/bgfx/chainreader.cpp')
-rw-r--r-- | src/osd/modules/render/bgfx/chainreader.cpp | 105 |
1 files changed, 37 insertions, 68 deletions
diff --git a/src/osd/modules/render/bgfx/chainreader.cpp b/src/osd/modules/render/bgfx/chainreader.cpp index 0892523faa6..79ab78cdaa2 100644 --- a/src/osd/modules/render/bgfx/chainreader.cpp +++ b/src/osd/modules/render/bgfx/chainreader.cpp @@ -13,25 +13,23 @@ #include "emu.h" #include <modules/lib/osdobj_common.h> +#include "chainreader.h" + #include "chain.h" #include "sliderreader.h" #include "paramreader.h" #include "chainentryreader.h" +#include "targetreader.h" #include "targetmanager.h" -#include "chainreader.h" -#include "target.h" #include "slider.h" #include "parameter.h" -const chain_reader::string_to_enum chain_reader::STYLE_NAMES[chain_reader::STYLE_COUNT] = { - { "guest", TARGET_STYLE_GUEST }, - { "native", TARGET_STYLE_NATIVE }, - { "custom", TARGET_STYLE_CUSTOM } -}; - bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix, osd_options& options, running_machine& machine, uint32_t window_index, texture_manager& textures, target_manager& targets, effect_manager& effects, uint32_t screen_width, uint32_t screen_height) { - validate_parameters(value, prefix); + if (!validate_parameters(value, prefix)) + { + return nullptr; + } std::string name = value["name"].GetString(); std::string author = value["author"].GetString(); @@ -44,6 +42,10 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix for (UINT32 i = 0; i < slider_array.Size(); i++) { std::vector<bgfx_slider*> expanded_sliders = slider_reader::read_from_value(slider_array[i], prefix + "sliders[" + std::to_string(i) + "]: ", machine, window_index); + if (expanded_sliders.size() == 0) + { + return nullptr; + } for (bgfx_slider* slider : expanded_sliders) { sliders.push_back(slider); @@ -62,11 +64,15 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix std::vector<bgfx_parameter*> parameters; if (value.HasMember("parameters")) { - READER_ASSERT(value["parameters"].IsArray(), (prefix + "Value 'parameters' must be an array\n").c_str()); const Value& param_array = value["parameters"]; for (UINT32 i = 0; i < param_array.Size(); i++) { - parameters.push_back(parameter_reader::read_from_value(param_array[i], prefix + "parameters[" + std::to_string(i) + "]; ", window_index)); + bgfx_parameter* parameter = parameter_reader::read_from_value(param_array[i], prefix + "parameters[" + std::to_string(i) + "]; ", window_index); + if (parameter == nullptr) + { + return nullptr; + } + parameters.push_back(parameter); } } @@ -80,56 +86,14 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix // Create targets if (value.HasMember("targets")) { - READER_ASSERT(value["targets"].IsArray(), (prefix + "Value 'targets' must be an array\n").c_str()); const Value& target_array = value["targets"]; // TODO: Move into its own reader for (UINT32 i = 0; i < target_array.Size(); i++) { - READER_ASSERT(target_array[i].HasMember("name"), (prefix + "targets[" + std::to_string(i) + "]: Must have string value 'name'\n").c_str()); - READER_ASSERT(target_array[i]["name"].IsString(), (prefix + "targets[" + std::to_string(i) + "]: Value 'name' must be a string\n").c_str()); - READER_ASSERT(target_array[i].HasMember("mode"), (prefix + "targets[" + std::to_string(i) + "]: Must have string enum 'mode'\n").c_str()); - READER_ASSERT(target_array[i]["mode"].IsString(), (prefix + "targets[" + std::to_string(i) + "]: Value 'mode' must be a string (what screens does this apply to?)\n").c_str()); - READER_ASSERT(!target_array[i].HasMember("bilinear") || target_array[i]["bilinear"].IsBool(), (prefix + "targets[" + std::to_string(i) + "]: Value 'bilinear' must be a boolean\n").c_str()); - READER_ASSERT(!target_array[i].HasMember("doublebuffer") || target_array[i]["doublebuffer"].IsBool(), (prefix + "targets[" + std::to_string(i) + "]: Value 'doublebuffer' must be a boolean\n").c_str()); - READER_ASSERT(!target_array[i].HasMember("prescale") || target_array[i]["prescale"].IsBool(), (prefix + "targets[" + std::to_string(i) + "]: Value 'prescale' must be a boolean\n").c_str()); - - std::string target_name = target_array[i]["name"].GetString(); - uint32_t mode = uint32_t(get_enum_from_value(target_array[i], "mode", TARGET_STYLE_NATIVE, STYLE_NAMES, STYLE_COUNT)); - bool bilinear = get_bool(target_array[i], "bilinear", true); - bool double_buffer = get_bool(target_array[i], "doublebuffer", true); - bool prescale = get_bool(target_array[i], "prescale", false); - - uint16_t width = 0; - uint16_t height = 0; - switch (mode) + if (!target_reader::read_from_value(target_array[i], prefix + "targets[" + std::to_string(i) + "]: ", targets, options, screen_width, screen_height)) { - case TARGET_STYLE_GUEST: - width = targets.guest_width(); - height = targets.guest_height(); - break; - case TARGET_STYLE_NATIVE: - width = screen_width; - height = screen_height; - break; - case TARGET_STYLE_CUSTOM: - READER_ASSERT(target_array[i].HasMember("width"), (prefix + "Target '" + target_name + "': Must have numeric value 'width'\n").c_str()); - READER_ASSERT(target_array[i]["width"].IsNumber(), (prefix + "Target '" + target_name + "': Value 'width' must be a number\n").c_str()); - READER_ASSERT(target_array[i].HasMember("height"), (prefix + "Target '" + target_name + "': Must have numeric value 'height'\n").c_str()); - READER_ASSERT(target_array[i]["height"].IsNumber(), (prefix + "Target '" + target_name + "': Value 'height' must be a number\n").c_str()); - width = uint32_t(target_array[i]["width"].GetDouble()); - height = uint32_t(target_array[i]["height"].GetDouble()); - break; + return nullptr; } - - uint32_t prescale_x = 1; - uint32_t prescale_y = 1; - if (prescale) - { - prescale_x = options.bgfx_prescale_x(); - prescale_y = options.bgfx_prescale_y(); - } - - targets.create_target(target_name, bgfx::TextureFormat::RGBA8, width, height, prescale_x, prescale_y, mode, double_buffer, bilinear); } } @@ -140,23 +104,28 @@ bgfx_chain* chain_reader::read_from_value(const Value& value, std::string prefix const Value& entry_array = value["passes"]; for (UINT32 i = 0; i < entry_array.Size(); i++) { - entries.push_back(chain_entry_reader::read_from_value(entry_array[i], prefix + "passes[" + std::to_string(i) + "]: ", options, textures, targets, effects, slider_map, param_map)); + bgfx_chain_entry* entry = chain_entry_reader::read_from_value(entry_array[i], prefix + "passes[" + std::to_string(i) + "]: ", options, textures, targets, effects, slider_map, param_map); + if (entry == nullptr) + { + return nullptr; + } + entries.push_back(entry); } } - std::string output = value["output"].GetString(); - - return new bgfx_chain(name, author, sliders, parameters, entries, output); + return new bgfx_chain(name, author, sliders, parameters, entries); } -void chain_reader::validate_parameters(const Value& value, std::string prefix) +bool chain_reader::validate_parameters(const Value& value, std::string prefix) { - READER_ASSERT(value.HasMember("name"), (prefix + "Must have string value 'name'\n").c_str()); - READER_ASSERT(value["name"].IsString(), (prefix + "Value 'name' must be a string\n").c_str()); - READER_ASSERT(value.HasMember("author"), (prefix + "Must have string value 'author'\n").c_str()); - READER_ASSERT(value["author"].IsString(), (prefix + "Value 'author' must be a string\n").c_str()); - READER_ASSERT(value.HasMember("passes"), (prefix + "Must have array value 'passes'\n").c_str()); - READER_ASSERT(value["passes"].IsArray(), (prefix + "Value 'passes' must be an array\n").c_str()); - READER_ASSERT(value.HasMember("output"), (prefix + "Must have string value 'output'\n").c_str()); - READER_ASSERT(value["output"].IsString(), (prefix + "Value 'output' must be a string\n").c_str()); + if (!READER_CHECK(value.HasMember("name"), (prefix + "Must have string value 'name'\n").c_str())) return false; + if (!READER_CHECK(value["name"].IsString(), (prefix + "Value 'name' must be a string\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("author"), (prefix + "Must have string value 'author'\n").c_str())) return false; + if (!READER_CHECK(value["author"].IsString(), (prefix + "Value 'author' must be a string\n").c_str())) return false; + if (!READER_CHECK(value.HasMember("passes"), (prefix + "Must have array value 'passes'\n").c_str())) return false; + if (!READER_CHECK(value["passes"].IsArray(), (prefix + "Value 'passes' must be an array\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("sliders") || value["sliders"].IsArray(), (prefix + "Value 'sliders' must be an array\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("parameters") || value["parameters"].IsArray(), (prefix + "Value 'parameters' must be an array\n").c_str())) return false; + if (!READER_CHECK(!value.HasMember("targets") || value["targets"].IsArray(), (prefix + "Value 'targets' must be an array\n").c_str())) return false; + return true; } |