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