diff options
Diffstat (limited to 'src/emu/dipalette.h')
-rw-r--r-- | src/emu/dipalette.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/src/emu/dipalette.h b/src/emu/dipalette.h new file mode 100644 index 00000000000..dcc3d38e2c0 --- /dev/null +++ b/src/emu/dipalette.h @@ -0,0 +1,144 @@ +// license:BSD-3-Clause +// copyright-holders:Aaron Giles +/*************************************************************************** + + dipalette.h + + Device palette interface. + +******************************************************************************/ + +#pragma once + +#ifndef __EMU_H__ +#error Dont include this file directly; include emu.h instead. +#endif + +#ifndef MAME_EMU_DIPALETTE_H +#define MAME_EMU_DIPALETTE_H + + +//************************************************************************** +// CONSTANTS +//************************************************************************** + +constexpr float PALETTE_DEFAULT_SHADOW_FACTOR = 0.6; +constexpr float PALETTE_DEFAULT_HIGHLIGHT_FACTOR = 1/PALETTE_DEFAULT_SHADOW_FACTOR; + + +//************************************************************************** +// TYPE DEFINITIONS +//************************************************************************** + +class gfx_element; + +typedef u16 indirect_pen_t; + + +// ======================> device_palette_interface + +class device_palette_interface : public device_interface +{ + static constexpr int MAX_SHADOW_PRESETS = 4; + +public: + // construction/destruction + 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(); } + 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; } + pen_t *shadow_table() const { return m_shadow_table; } + rgb_t pen_color(pen_t pen) const { return m_palette->entry_color(pen); } + 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; } + + // setters + void set_pen_color(pen_t pen, rgb_t rgb) { m_palette->entry_set_color(pen, rgb); } + void set_pen_red_level(pen_t pen, u8 level) { m_palette->entry_set_red_level(pen, level); } + void set_pen_green_level(pen_t pen, u8 level) { m_palette->entry_set_green_level(pen, level); } + void set_pen_blue_level(pen_t pen, u8 level) { m_palette->entry_set_blue_level(pen, level); } + void set_pen_color(pen_t pen, u8 r, u8 g, u8 b) { m_palette->entry_set_color(pen, rgb_t(r, g, b)); } + void set_pen_colors(pen_t color_base, const rgb_t *colors, int color_count) { while (color_count--) set_pen_color(color_base++, *colors++); } + void set_pen_colors(pen_t color_base, const std::vector<rgb_t> &colors) { for (unsigned int i=0; i != colors.size(); i++) set_pen_color(color_base+i, colors[i]); } + void set_pen_contrast(pen_t pen, double bright) { m_palette->entry_set_contrast(pen, bright); } + + // indirection (aka colortables) + indirect_pen_t pen_indirect(int index) const { return m_indirect_pens[index]; } + rgb_t indirect_color(int index) const { return m_indirect_colors[index]; } + void set_indirect_color(int index, rgb_t rgb); + void set_pen_indirect(pen_t pen, indirect_pen_t index); + u32 transpen_mask(gfx_element &gfx, u32 color, indirect_pen_t transcolor) const; + + // shadow config + void set_shadow_factor(double factor) { assert(m_shadow_group != 0); m_palette->group_set_contrast(m_shadow_group, factor); } + void set_highlight_factor(double factor) { assert(m_hilight_group != 0); m_palette->group_set_contrast(m_hilight_group, factor); } + void set_shadow_mode(int mode) { assert(mode >= 0 && mode < MAX_SHADOW_PRESETS); m_shadow_table = m_shadow_tables[mode].base; } + +protected: + // interface-level overrides + virtual void interface_pre_start() override; + virtual void interface_post_start() override; + virtual void interface_pre_save() override; + virtual void interface_post_load() override; + virtual void interface_post_stop() override; + + // configuration-related overrides + virtual int palette_entries() const = 0; + virtual int palette_indirect_entries() const { return 0; } + virtual bool palette_shadows_enabled() const { return false; } + virtual bool palette_hilights_enabled() const { return false; } + +private: + // internal helpers + void allocate_palette(int numentries); + void allocate_color_tables(); + void allocate_shadow_tables(); +public: // needed by konamigx + void set_shadow_dRGB32(int mode, int dr, int dg, int db, bool noclip); +private: + void configure_rgb_shadows(int mode, float factor); + + // internal state + palette_t * m_palette; // the palette itself + const pen_t * m_pens; // remapped palette pen numbers + bitmap_format m_format; // format assumed for palette data + pen_t * m_shadow_table; // table for looking up a shadowed pen + u32 m_shadow_group; // index of the shadow group, or 0 if none + u32 m_hilight_group; // index of the hilight group, or 0 if none + pen_t m_white_pen; // precomputed white pen value + pen_t m_black_pen; // precomputed black pen value + + // indirection state + std::vector<rgb_t> m_indirect_colors; // actual colors set for indirection + std::vector<indirect_pen_t> m_indirect_pens; // indirection values + + struct shadow_table_data + { + pen_t * base; // pointer to the base of the table + s16 dr; // delta red value + s16 dg; // delta green value + s16 db; // delta blue value + bool noclip; // clip? + }; + shadow_table_data m_shadow_tables[MAX_SHADOW_PRESETS]; // array of shadow table data + + std::vector<pen_t> m_save_pen; // pens for save/restore + std::vector<float> m_save_contrast; // brightness for save/restore + + std::vector<pen_t> m_pen_array; + std::vector<pen_t> m_shadow_array; + std::vector<pen_t> m_hilight_array; +}; + +// interface type iterator +typedef device_interface_iterator<device_palette_interface> palette_interface_iterator; + + +#endif // MAME_EMU_DIPALETTE_H |