summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/render.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/render.h')
-rw-r--r--src/emu/render.h181
1 files changed, 98 insertions, 83 deletions
diff --git a/src/emu/render.h b/src/emu/render.h
index 66c885a4c78..e07e7e7cad7 100644
--- a/src/emu/render.h
+++ b/src/emu/render.h
@@ -57,6 +57,9 @@
#include <vector>
+namespace emu { namespace render { namespace detail { class layout_environment; } } }
+
+
//**************************************************************************
// CONSTANTS
//**************************************************************************
@@ -127,41 +130,38 @@ constexpr u32 PRIMFLAG_PACKABLE = 1 << PRIMFLAG_PACKABLE_SHIFT;
// MACROS
//**************************************************************************
-#define PRIMFLAG_TEXORIENT(x) ((x) << PRIMFLAG_TEXORIENT_SHIFT)
-#define PRIMFLAG_GET_TEXORIENT(x) (((x) & PRIMFLAG_TEXORIENT_MASK) >> PRIMFLAG_TEXORIENT_SHIFT)
+constexpr u32 PRIMFLAG_TEXORIENT(u32 x) { return x << PRIMFLAG_TEXORIENT_SHIFT; }
+constexpr u32 PRIMFLAG_GET_TEXORIENT(u32 x) { return (x & PRIMFLAG_TEXORIENT_MASK) >> PRIMFLAG_TEXORIENT_SHIFT; }
-#define PRIMFLAG_TEXFORMAT(x) ((x) << PRIMFLAG_TEXFORMAT_SHIFT)
-#define PRIMFLAG_GET_TEXFORMAT(x) (((x) & PRIMFLAG_TEXFORMAT_MASK) >> PRIMFLAG_TEXFORMAT_SHIFT)
+constexpr u32 PRIMFLAG_TEXFORMAT(u32 x) { return x << PRIMFLAG_TEXFORMAT_SHIFT; }
+constexpr u32 PRIMFLAG_GET_TEXFORMAT(u32 x) { return (x & PRIMFLAG_TEXFORMAT_MASK) >> PRIMFLAG_TEXFORMAT_SHIFT; }
-#define PRIMFLAG_BLENDMODE(x) ((x) << PRIMFLAG_BLENDMODE_SHIFT)
-#define PRIMFLAG_GET_BLENDMODE(x) (((x) & PRIMFLAG_BLENDMODE_MASK) >> PRIMFLAG_BLENDMODE_SHIFT)
+constexpr u32 PRIMFLAG_BLENDMODE(u32 x) { return x << PRIMFLAG_BLENDMODE_SHIFT; }
+constexpr u32 PRIMFLAG_GET_BLENDMODE(u32 x) { return (x & PRIMFLAG_BLENDMODE_MASK) >> PRIMFLAG_BLENDMODE_SHIFT; }
-#define PRIMFLAG_ANTIALIAS(x) ((x) << PRIMFLAG_ANTIALIAS_SHIFT)
-#define PRIMFLAG_GET_ANTIALIAS(x) (((x) & PRIMFLAG_ANTIALIAS_MASK) >> PRIMFLAG_ANTIALIAS_SHIFT)
+constexpr u32 PRIMFLAG_ANTIALIAS(u32 x) { return x << PRIMFLAG_ANTIALIAS_SHIFT; }
+constexpr u32 PRIMFLAG_GET_ANTIALIAS(u32 x) { return (x & PRIMFLAG_ANTIALIAS_MASK) >> PRIMFLAG_ANTIALIAS_SHIFT; }
-#define PRIMFLAG_SCREENTEX(x) ((x) << PRIMFLAG_SCREENTEX_SHIFT)
-#define PRIMFLAG_GET_SCREENTEX(x) (((x) & PRIMFLAG_SCREENTEX_MASK) >> PRIMFLAG_SCREENTEX_SHIFT)
+constexpr u32 PRIMFLAG_SCREENTEX(u32 x) { return x << PRIMFLAG_SCREENTEX_SHIFT; }
+constexpr u32 PRIMFLAG_GET_SCREENTEX(u32 x) { return (x & PRIMFLAG_SCREENTEX_MASK) >> PRIMFLAG_SCREENTEX_SHIFT; }
-#define PRIMFLAG_TEXWRAP(x) ((x) << PRIMFLAG_TEXWRAP_SHIFT)
-#define PRIMFLAG_GET_TEXWRAP(x) (((x) & PRIMFLAG_TEXWRAP_MASK) >> PRIMFLAG_TEXWRAP_SHIFT)
+constexpr u32 PRIMFLAG_TEXWRAP(u32 x) { return x << PRIMFLAG_TEXWRAP_SHIFT; }
+constexpr u32 PRIMFLAG_GET_TEXWRAP(u32 x) { return (x & PRIMFLAG_TEXWRAP_MASK) >> PRIMFLAG_TEXWRAP_SHIFT; }
-#define PRIMFLAG_TEXSHADE(x) ((x) << PRIMFLAG_TEXSHADE_SHIFT)
-#define PRIMFLAG_GET_TEXSHADE(x) (((x) & PRIMFLAG_TEXSHADE_MASK) >> PRIMFLAG_TEXSHADE_SHIFT)
+constexpr u32 PRIMFLAG_TEXSHADE(u32 x) { return x << PRIMFLAG_TEXSHADE_SHIFT; }
+constexpr u32 PRIMFLAG_GET_TEXSHADE(u32 x) { return (x & PRIMFLAG_TEXSHADE_MASK) >> PRIMFLAG_TEXSHADE_SHIFT; }
-#define PRIMFLAG_VECTOR(x) ((x) << PRIMFLAG_VECTOR_SHIFT)
-#define PRIMFLAG_GET_VECTOR(x) (((x) & PRIMFLAG_VECTOR_MASK) >> PRIMFLAG_VECTOR_SHIFT)
+constexpr u32 PRIMFLAG_VECTOR(u32 x) { return x << PRIMFLAG_VECTOR_SHIFT; }
+constexpr u32 PRIMFLAG_GET_VECTOR(u32 x) { return (x & PRIMFLAG_VECTOR_MASK) >> PRIMFLAG_VECTOR_SHIFT; }
-#define PRIMFLAG_VECTORBUF(x) ((x) << PRIMFLAG_VECTORBUF_SHIFT)
-#define PRIMFLAG_GET_VECTORBUF(x) (((x) & PRIMFLAG_VECTORBUF_MASK) >> PRIMFLAG_VECTORBUF_SHIFT)
+constexpr u32 PRIMFLAG_VECTORBUF(u32 x) { return x << PRIMFLAG_VECTORBUF_SHIFT; }
+constexpr u32 PRIMFLAG_GET_VECTORBUF(u32 x) { return (x & PRIMFLAG_VECTORBUF_MASK) >> PRIMFLAG_VECTORBUF_SHIFT; }
//**************************************************************************
// TYPE DEFINITIONS
//**************************************************************************
-// private classes declared in render.cpp
-struct object_transform;
-
// texture scaling callback
typedef void (*texture_scaler_func)(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
@@ -173,8 +173,8 @@ struct render_bounds
float x1; // rightmost X coordinate
float y1; // bottommost Y coordinate
- float width() const { return x1 - x0; }
- float height() const { return y1 - y0; }
+ constexpr float width() const { return x1 - x0; }
+ constexpr float height() const { return y1 - y0; }
};
@@ -232,12 +232,10 @@ class render_screen_list
public:
// construction/destruction
- item(screen_device &screen)
- : m_next(nullptr),
- m_screen(screen) { }
+ item(screen_device &screen) : m_screen(screen) { }
// state
- item * m_next; // next screen in list
+ item * m_next = nullptr; // next screen in list
screen_device & m_screen; // reference to screen device
};
@@ -253,7 +251,7 @@ public:
int contains(screen_device &screen) const
{
int count = 0;
- for (item *curitem = m_list.first(); curitem != nullptr; curitem = curitem->m_next)
+ for (item *curitem = m_list.first(); curitem; curitem = curitem->m_next)
if (&curitem->m_screen == &screen) count++;
return count;
}
@@ -269,6 +267,7 @@ private:
// render_layer_config - describes the state of layers
class render_layer_config
{
+private:
static constexpr u8 ENABLE_BACKDROP = 0x01; // enable backdrop layers
static constexpr u8 ENABLE_OVERLAY = 0x02; // enable overlay layers
static constexpr u8 ENABLE_BEZEL = 0x04; // enable bezel layers
@@ -278,31 +277,36 @@ class render_layer_config
static constexpr u8 ENABLE_SCREEN_OVERLAY = 0x40; // enable screen overlays
static constexpr u8 DEFAULT = ENABLE_BACKDROP | ENABLE_OVERLAY | ENABLE_BEZEL | ENABLE_CPANEL | ENABLE_MARQUEE | ENABLE_SCREEN_OVERLAY;
+ u8 m_state = DEFAULT;
+
+ render_layer_config &set_flag(u8 flag, bool enable)
+ {
+ if (enable) m_state |= flag;
+ else m_state &= ~flag;
+ return *this;
+ }
+
public:
- render_layer_config()
- : m_state(DEFAULT) { }
+ constexpr render_layer_config() { }
bool operator==(const render_layer_config &rhs) const { return m_state == rhs.m_state; }
bool operator!=(const render_layer_config &rhs) const { return m_state != rhs.m_state; }
- bool backdrops_enabled() const { return ((m_state & ENABLE_BACKDROP) != 0); }
- bool overlays_enabled() const { return ((m_state & ENABLE_OVERLAY) != 0); }
- bool bezels_enabled() const { return ((m_state & ENABLE_BEZEL) != 0); }
- bool cpanels_enabled() const { return ((m_state & ENABLE_CPANEL) != 0); }
- bool marquees_enabled() const { return ((m_state & ENABLE_MARQUEE) != 0); }
- bool screen_overlay_enabled() const { return ((m_state & ENABLE_SCREEN_OVERLAY) != 0); }
- bool zoom_to_screen() const { return ((m_state & ZOOM_TO_SCREEN) != 0); }
-
- render_layer_config &set_backdrops_enabled(bool enable) { if (enable) m_state |= ENABLE_BACKDROP; else m_state &= ~ENABLE_BACKDROP; return *this; }
- render_layer_config &set_overlays_enabled(bool enable) { if (enable) m_state |= ENABLE_OVERLAY; else m_state &= ~ENABLE_OVERLAY; return *this; }
- render_layer_config &set_bezels_enabled(bool enable) { if (enable) m_state |= ENABLE_BEZEL; else m_state &= ~ENABLE_BEZEL; return *this; }
- render_layer_config &set_cpanels_enabled(bool enable) { if (enable) m_state |= ENABLE_CPANEL; else m_state &= ~ENABLE_CPANEL; return *this; }
- render_layer_config &set_marquees_enabled(bool enable) { if (enable) m_state |= ENABLE_MARQUEE; else m_state &= ~ENABLE_MARQUEE; return *this; }
- render_layer_config &set_screen_overlay_enabled(bool enable) { if (enable) m_state |= ENABLE_SCREEN_OVERLAY; else m_state &= ~ENABLE_SCREEN_OVERLAY; return *this; }
- render_layer_config &set_zoom_to_screen(bool zoom) { if (zoom) m_state |= ZOOM_TO_SCREEN; else m_state &= ~ZOOM_TO_SCREEN; return *this; }
-
-private:
- u8 m_state;
+ constexpr bool backdrops_enabled() const { return (m_state & ENABLE_BACKDROP) != 0; }
+ constexpr bool overlays_enabled() const { return (m_state & ENABLE_OVERLAY) != 0; }
+ constexpr bool bezels_enabled() const { return (m_state & ENABLE_BEZEL) != 0; }
+ constexpr bool cpanels_enabled() const { return (m_state & ENABLE_CPANEL) != 0; }
+ constexpr bool marquees_enabled() const { return (m_state & ENABLE_MARQUEE) != 0; }
+ constexpr bool screen_overlay_enabled() const { return (m_state & ENABLE_SCREEN_OVERLAY) != 0; }
+ constexpr bool zoom_to_screen() const { return (m_state & ZOOM_TO_SCREEN) != 0; }
+
+ render_layer_config &set_backdrops_enabled(bool enable) { return set_flag(ENABLE_BACKDROP, enable); }
+ render_layer_config &set_overlays_enabled(bool enable) { return set_flag(ENABLE_OVERLAY, enable); }
+ render_layer_config &set_bezels_enabled(bool enable) { return set_flag(ENABLE_BEZEL, enable); }
+ render_layer_config &set_cpanels_enabled(bool enable) { return set_flag(ENABLE_CPANEL, enable); }
+ render_layer_config &set_marquees_enabled(bool enable) { return set_flag(ENABLE_MARQUEE, enable); }
+ render_layer_config &set_screen_overlay_enabled(bool enable) { return set_flag(ENABLE_SCREEN_OVERLAY, enable); }
+ render_layer_config &set_zoom_to_screen(bool zoom) { return set_flag(ZOOM_TO_SCREEN, zoom); }
};
@@ -314,13 +318,7 @@ class render_primitive
friend class simple_list<render_primitive>;
public:
- render_primitive():
- type(),
- flags(0),
- width(0),
- container(nullptr),
- m_next(nullptr)
- {}
+ render_primitive() { }
// render primitive types
enum primitive_type
@@ -342,19 +340,19 @@ public:
void reset();
// public state
- primitive_type type; // type of primitive
+ primitive_type type = INVALID; // type of primitive
render_bounds bounds; // bounds or positions
render_bounds full_bounds; // bounds or positions (unclipped)
render_color color; // RGBA values
- u32 flags; // flags
- float width; // width (for line primitives)
+ u32 flags = 0U; // flags
+ float width = 0.0F; // width (for line primitives)
render_texinfo texture; // texture info (for quad primitives)
render_quad_texuv texcoords; // texture coordinates (for quad primitives)
- render_container * container; // the render container we belong to
+ render_container * container = nullptr;// the render container we belong to
private:
// internal state
- render_primitive * m_next; // pointer to next element
+ render_primitive * m_next = nullptr; // pointer to next element
};
@@ -459,7 +457,7 @@ private:
struct scaled_texture
{
bitmap_argb32 * bitmap; // final bitmap
- u32 seqid; // sequence number
+ u32 seqid; // sequence number
};
// internal state
@@ -468,12 +466,12 @@ private:
bitmap_t * m_bitmap; // pointer to the original bitmap
rectangle m_sbounds; // source bounds within the bitmap
texture_format m_format; // format of the texture data
- u64 m_osddata; // aux data to pass to osd
+ u64 m_osddata; // aux data to pass to osd
// scaling state (ARGB32 only)
texture_scaler_func m_scaler; // scaling callback
void * m_param; // scaling callback parameter
- u32 m_curseq; // current sequence number
+ u32 m_curseq; // current sequence number
scaled_texture m_scaled[MAX_TEXTURE_SCALES];// array of scaled variants of this texture
};
@@ -566,11 +564,11 @@ private:
private:
// internal state
item * m_next; // pointer to the next element in the list
- u8 m_type; // type of element
+ u8 m_type; // type of element
render_bounds m_bounds; // bounds of the element
render_color m_color; // RGBA factors
- u32 m_flags; // option flags
- u32 m_internal; // internal flags
+ u32 m_flags; // option flags
+ u32 m_internal; // internal flags
float m_width; // width of the line (lines only)
render_texture * m_texture; // pointer to the source texture (quads only)
};
@@ -635,8 +633,10 @@ DECLARE_ENUM_INCDEC_OPERATORS(item_layer)
class layout_element
{
public:
+ using environment = emu::render::detail::layout_environment;
+
// construction/destruction
- layout_element(running_machine &machine, util::xml::data_node const &elemnode, const char *dirname);
+ layout_element(environment &env, util::xml::data_node const &elemnode, const char *dirname);
virtual ~layout_element();
// getters
@@ -659,7 +659,7 @@ private:
typedef std::unique_ptr<component> ptr;
// construction/destruction
- component(running_machine &machine, util::xml::data_node const &compnode, const char *dirname);
+ component(environment &env, util::xml::data_node const &compnode, const char *dirname);
virtual ~component() = default;
// setup
@@ -727,13 +727,13 @@ private:
int m_state; // associated state number
};
- typedef component::ptr (*make_component_func)(running_machine &machine, util::xml::data_node const &compnode, const char *dirname);
+ typedef component::ptr (*make_component_func)(environment &env, util::xml::data_node const &compnode, const char *dirname);
typedef std::map<std::string, make_component_func> make_component_map;
// internal helpers
static void element_scale(bitmap_argb32 &dest, bitmap_argb32 &source, const rectangle &sbounds, void *param);
- template <typename T> static component::ptr make_component(running_machine &machine, util::xml::data_node const &compnode, const char *dirname);
- template <int D> static component::ptr make_dotmatrix_component(running_machine &machine, util::xml::data_node const &compnode, const char *dirname);
+ template <typename T> static component::ptr make_component(environment &env, util::xml::data_node const &compnode, const char *dirname);
+ template <int D> static component::ptr make_dotmatrix_component(environment &env, util::xml::data_node const &compnode, const char *dirname);
static make_component_map const s_make_component; // maps component XML names to creator functions
@@ -757,9 +757,10 @@ private:
class layout_group
{
public:
- typedef std::unordered_map<std::string, layout_group> group_map;
+ using environment = emu::render::detail::layout_environment;
+ using group_map = std::unordered_map<std::string, layout_group>;
- layout_group(running_machine &machine, util::xml::data_node const &groupnode);
+ layout_group(util::xml::data_node const &groupnode);
~layout_group();
util::xml::data_node const &get_groupnode() const { return m_groupnode; }
@@ -767,12 +768,19 @@ public:
render_bounds make_transform(render_bounds const &dest) const;
render_bounds make_transform(render_bounds const &dest, render_bounds const &transform) const;
- void resolve_bounds(group_map &groupmap);
+ void set_bounds_unresolved();
+ void resolve_bounds(environment &env, group_map &groupmap);
private:
- void resolve_bounds(group_map &groupmap, std::vector<layout_group const *> &seen);
+ void resolve_bounds(environment &env, group_map &groupmap, std::vector<layout_group const *> &seen);
+ void resolve_bounds(
+ environment &env,
+ util::xml::data_node const &parentnode,
+ group_map &groupmap,
+ std::vector<layout_group const *> &seen,
+ bool repeat,
+ bool init);
- running_machine & m_machine;
util::xml::data_node const & m_groupnode;
render_bounds m_bounds;
bool m_bounds_resolved;
@@ -787,6 +795,7 @@ private:
class layout_view
{
public:
+ using environment = emu::render::detail::layout_environment;
using element_map = std::unordered_map<std::string, layout_element>;
using group_map = std::unordered_map<std::string, layout_group>;
@@ -806,7 +815,7 @@ public:
public:
// construction/destruction
item(
- device_t &device,
+ environment &env,
util::xml::data_node const &itemnode,
element_map &elemmap,
render_bounds const &transform);
@@ -846,10 +855,10 @@ public:
// construction/destruction
layout_view(
- device_t &device,
+ environment &env,
util::xml::data_node const &viewnode,
element_map &elemmap,
- group_map const &groupmap);
+ group_map &groupmap);
~layout_view();
// getters
@@ -873,13 +882,16 @@ public:
private:
// add items, recursing for groups
void add_items(
- device_t &device,
+ environment &env,
util::xml::data_node const &parentnode,
element_map &elemmap,
- group_map const &groupmap,
- render_bounds const &transform);
+ group_map &groupmap,
+ render_bounds const &transform,
+ bool root,
+ bool repeat,
+ bool init);
- static std::string make_name(device_t &device, util::xml::data_node const &viewnode);
+ static std::string make_name(environment &env, util::xml::data_node const &viewnode);
// internal state
std::string m_name; // name of the layout
@@ -1014,6 +1026,9 @@ public:
void resolve_tags();
private:
+ // private classes declared in render.cpp
+ struct object_transform;
+
// internal helpers
enum constructor_impl_t { CONSTRUCTOR_IMPL };
template <typename T> render_target(render_manager &manager, T&& layout, u32 flags, constructor_impl_t);