From ed4926d53464daa067d4a656ff1c765fc72bc8bf Mon Sep 17 00:00:00 2001 From: AJR Date: Tue, 11 Apr 2017 14:06:16 -0400 Subject: [PATCH] dipalette: A return to sanity (nw) * Revert entries(), indirect_entries(), shadows_enabled() and hilights_enabled() to return the configuration parameters instead of accessing the live state. The thought behind the implementation change was that palette devices could potentially determine the number of entries from the sizes of devfind objects. The regressions caused by this have been worked around, but it was probably a bad idea in the first place. * Zero-entry palettes are no longer valid. The code that tried to support them was basically left over from when every running machine had a single global palette. --- src/emu/dipalette.cpp | 49 +++++++++++++++++++++++++++---------------- src/emu/dipalette.h | 9 ++++---- 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/src/emu/dipalette.cpp b/src/emu/dipalette.cpp index 125f7b2c53c..86af84d8085 100644 --- a/src/emu/dipalette.cpp +++ b/src/emu/dipalette.cpp @@ -36,6 +36,20 @@ device_palette_interface::device_palette_interface(const machine_config &mconfig } +//------------------------------------------------- +// interface_validity_check - validation for a +// device after the configuration has been +// constructed +//------------------------------------------------- + +void device_palette_interface::interface_validity_check(validity_checker &valid) const +{ + // this info must be available before the device has started + if (palette_entries() == 0) + osd_printf_error("Palette has no entries specified\n"); +} + + //------------------------------------------------- // interface_pre_start - work to be done prior to // actually starting a device @@ -49,27 +63,24 @@ void device_palette_interface::interface_pre_start() // allocate the palette int numentries = palette_entries(); - if (numentries > 0) + allocate_palette(numentries); + allocate_color_tables(); + allocate_shadow_tables(); + + // allocate indirection tables + int indirect_colors = palette_indirect_entries(); + if (indirect_colors > 0) { - allocate_palette(numentries); - allocate_color_tables(); - allocate_shadow_tables(); - - // allocate indirection tables - int indirect_colors = palette_indirect_entries(); - if (indirect_colors > 0) + m_indirect_colors.resize(indirect_colors); + for (int color = 0; color < indirect_colors; color++) { - m_indirect_colors.resize(indirect_colors); - for (int color = 0; color < indirect_colors; color++) - { - // alpha = 0 ensures change is detected the first time set_indirect_color() is called - m_indirect_colors[color] = rgb_t::transparent(); - } - - m_indirect_pens.resize(numentries); - for (int pen = 0; pen < numentries; pen++) - m_indirect_pens[pen] = pen % indirect_colors; + // alpha = 0 ensures change is detected the first time set_indirect_color() is called + m_indirect_colors[color] = rgb_t::transparent(); } + + m_indirect_pens.resize(numentries); + for (int pen = 0; pen < numentries; pen++) + m_indirect_pens[pen] = pen % indirect_colors; } } @@ -330,6 +341,8 @@ void device_palette_interface::set_shadow_dRGB32(int mode, int dr, int dg, int d void device_palette_interface::allocate_palette(int numentries) { + assert(numentries > 0); + // determine the number of groups we need int numgroups = 1; if (palette_shadows_enabled()) diff --git a/src/emu/dipalette.h b/src/emu/dipalette.h index ed0a6f31a39..4a1e5ea7d8d 100644 --- a/src/emu/dipalette.h +++ b/src/emu/dipalette.h @@ -46,8 +46,8 @@ public: device_palette_interface(const machine_config &mconfig, device_t &device); // getters - int entries() const { return (m_palette != nullptr) ? m_palette->num_colors() : 0; } - int indirect_entries() const { return m_indirect_colors.size(); } + int entries() const { return palette_entries(); } + int indirect_entries() const { return palette_indirect_entries(); } palette_t *palette() const { return m_palette; } const pen_t &pen(int index) const { return m_pens[index]; } const pen_t *pens() const { return m_pens; } @@ -56,8 +56,8 @@ public: double pen_contrast(pen_t pen) const { return m_palette->entry_contrast(pen); } pen_t black_pen() const { return m_black_pen; } pen_t white_pen() const { return m_white_pen; } - bool shadows_enabled() const { return m_shadow_group != 0; } - bool hilights_enabled() const { return m_hilight_group != 0; } + bool shadows_enabled() const { return palette_shadows_enabled(); } + bool hilights_enabled() const { return palette_hilights_enabled(); } // setters void set_pen_color(pen_t pen, rgb_t rgb) { m_palette->entry_set_color(pen, rgb); } @@ -83,6 +83,7 @@ public: protected: // interface-level overrides + virtual void interface_validity_check(validity_checker &valid) const override; virtual void interface_pre_start() override; virtual void interface_post_start() override; virtual void interface_pre_save() override;