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;