1 // license:BSD-3-Clause 2 // copyright-holders:Aaron Giles 3 /*************************************************************************** 4 5 dipalette.h 6 7 Device palette interface. 8 9 ******************************************************************************/ 10 11 #pragma once 12 13 #ifndef __EMU_H__ 14 #error Dont include this file directly; include emu.h instead. 15 #endif 16 17 #ifndef MAME_EMU_DIPALETTE_H 18 #define MAME_EMU_DIPALETTE_H 19 20 21 //************************************************************************** 22 // CONSTANTS 23 //************************************************************************** 24 25 constexpr float PALETTE_DEFAULT_SHADOW_FACTOR = 0.6f; 26 constexpr float PALETTE_DEFAULT_HIGHLIGHT_FACTOR = 1.0f/PALETTE_DEFAULT_SHADOW_FACTOR; 27 28 29 //************************************************************************** 30 // TYPE DEFINITIONS 31 //************************************************************************** 32 33 typedef u16 indirect_pen_t; 34 35 36 // ======================> device_palette_interface 37 38 class device_palette_interface : public device_interface 39 { 40 friend class screen_device; 41 42 static constexpr int MAX_SHADOW_PRESETS = 4; 43 44 public: 45 // getters entries()46 u32 entries() const { return palette_entries(); } indirect_entries()47 u32 indirect_entries() const { return palette_indirect_entries(); } palette()48 palette_t *palette() const { return m_palette; } pen(int index)49 const pen_t &pen(int index) const { return m_pens[index]; } pens()50 const pen_t *pens() const { return m_pens; } shadow_table()51 pen_t *shadow_table() const { return m_shadow_table; } pen_color(pen_t pen)52 rgb_t pen_color(pen_t pen) const { return m_palette->entry_color(pen); } pen_contrast(pen_t pen)53 double pen_contrast(pen_t pen) const { return m_palette->entry_contrast(pen); } black_pen()54 pen_t black_pen() const { return m_black_pen; } white_pen()55 pen_t white_pen() const { return m_white_pen; } shadows_enabled()56 bool shadows_enabled() const { return palette_shadows_enabled(); } hilights_enabled()57 bool hilights_enabled() const { return palette_hilights_enabled(); } 58 59 // setters set_pen_color(pen_t pen,rgb_t rgb)60 void set_pen_color(pen_t pen, rgb_t rgb) { m_palette->entry_set_color(pen, rgb); } set_pen_red_level(pen_t pen,u8 level)61 void set_pen_red_level(pen_t pen, u8 level) { m_palette->entry_set_red_level(pen, level); } set_pen_green_level(pen_t pen,u8 level)62 void set_pen_green_level(pen_t pen, u8 level) { m_palette->entry_set_green_level(pen, level); } set_pen_blue_level(pen_t pen,u8 level)63 void set_pen_blue_level(pen_t pen, u8 level) { m_palette->entry_set_blue_level(pen, level); } set_pen_color(pen_t pen,u8 r,u8 g,u8 b)64 void set_pen_color(pen_t pen, u8 r, u8 g, u8 b) { m_palette->entry_set_color(pen, rgb_t(r, g, b)); } set_pen_colors(pen_t color_base,const rgb_t * colors,int color_count)65 void set_pen_colors(pen_t color_base, const rgb_t *colors, int color_count) { while (color_count--) set_pen_color(color_base++, *colors++); } set_pen_colors(pen_t color_base,const rgb_t (& colors)[N])66 template <size_t N> void set_pen_colors(pen_t color_base, const rgb_t (&colors)[N]) { set_pen_colors(color_base, colors, N); } set_pen_colors(pen_t color_base,const std::vector<rgb_t> & colors)67 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]); } set_pen_contrast(pen_t pen,double bright)68 void set_pen_contrast(pen_t pen, double bright) { m_palette->entry_set_contrast(pen, bright); } 69 70 // indirection (aka colortables) pen_indirect(int index)71 indirect_pen_t pen_indirect(int index) const { return m_indirect_pens[index]; } indirect_color(int index)72 rgb_t indirect_color(int index) const { return m_indirect_colors[index]; } 73 void set_indirect_color(int index, rgb_t rgb); 74 void set_pen_indirect(pen_t pen, indirect_pen_t index); 75 u32 transpen_mask(gfx_element &gfx, u32 color, indirect_pen_t transcolor) const; 76 77 // shadow config set_shadow_factor(double factor)78 void set_shadow_factor(double factor) { assert(m_shadow_group != 0); m_palette->group_set_contrast(m_shadow_group, factor); } set_highlight_factor(double factor)79 void set_highlight_factor(double factor) { assert(m_hilight_group != 0); m_palette->group_set_contrast(m_hilight_group, factor); } set_shadow_mode(int mode)80 void set_shadow_mode(int mode) { assert(mode >= 0 && mode < MAX_SHADOW_PRESETS); m_shadow_table = m_shadow_tables[mode].base; } 81 82 protected: 83 // construction/destruction 84 device_palette_interface(const machine_config &mconfig, device_t &device); 85 86 // interface-level overrides 87 virtual void interface_validity_check(validity_checker &valid) const override; 88 virtual void interface_pre_start() override; 89 virtual void interface_post_start() override; 90 virtual void interface_pre_save() override; 91 virtual void interface_post_load() override; 92 virtual void interface_post_stop() override; 93 94 // configuration-related overrides 95 virtual u32 palette_entries() const = 0; palette_indirect_entries()96 virtual u32 palette_indirect_entries() const { return 0; } palette_shadows_enabled()97 virtual bool palette_shadows_enabled() const { return false; } palette_hilights_enabled()98 virtual bool palette_hilights_enabled() const { return false; } 99 100 private: 101 // internal helpers 102 void allocate_palette(u32 numentries); 103 void allocate_color_tables(); 104 void allocate_shadow_tables(); 105 public: // needed by konamigx 106 void set_shadow_dRGB32(int mode, int dr, int dg, int db, bool noclip); 107 private: 108 void configure_rgb_shadows(int mode, float factor); 109 110 // internal state 111 palette_t * m_palette; // the palette itself 112 const pen_t * m_pens; // remapped palette pen numbers 113 bitmap_format m_format; // format assumed for palette data 114 pen_t * m_shadow_table; // table for looking up a shadowed pen 115 u32 m_shadow_group; // index of the shadow group, or 0 if none 116 u32 m_hilight_group; // index of the hilight group, or 0 if none 117 pen_t m_white_pen; // precomputed white pen value 118 pen_t m_black_pen; // precomputed black pen value 119 120 // indirection state 121 std::vector<rgb_t> m_indirect_colors; // actual colors set for indirection 122 std::vector<indirect_pen_t> m_indirect_pens; // indirection values 123 124 struct shadow_table_data 125 { 126 pen_t * base; // pointer to the base of the table 127 s16 dr; // delta red value 128 s16 dg; // delta green value 129 s16 db; // delta blue value 130 bool noclip; // clip? 131 }; 132 shadow_table_data m_shadow_tables[MAX_SHADOW_PRESETS]; // array of shadow table data 133 134 std::vector<pen_t> m_save_pen; // pens for save/restore 135 std::vector<float> m_save_contrast; // brightness for save/restore 136 137 std::vector<pen_t> m_pen_array; 138 std::vector<pen_t> m_shadow_array; 139 std::vector<pen_t> m_hilight_array; 140 }; 141 142 // interface type iterator 143 typedef device_interface_iterator<device_palette_interface> palette_interface_iterator; 144 145 146 #endif // MAME_EMU_DIPALETTE_H 147