diff options
Diffstat (limited to 'src/emu/tilemap.cpp')
-rw-r--r-- | src/emu/tilemap.cpp | 122 |
1 files changed, 82 insertions, 40 deletions
diff --git a/src/emu/tilemap.cpp b/src/emu/tilemap.cpp index 083b4b4ef5a..44360a2a486 100644 --- a/src/emu/tilemap.cpp +++ b/src/emu/tilemap.cpp @@ -336,7 +336,9 @@ inline void tilemap_t::scanline_draw_masked_rgb32_alpha(u32 *dest, const u16 *so // tilemap_t - constructor //------------------------------------------------- -tilemap_t::tilemap_t() +tilemap_t::tilemap_t(device_t &owner) + : m_mapper(owner) + , m_tile_get_info(owner) { // until init() is called, data is floating; this is deliberate } @@ -346,11 +348,18 @@ tilemap_t::tilemap_t() // init - initialize the tilemap //------------------------------------------------- -tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows) +void tilemap_t::init_common( + tilemap_manager &manager, + device_gfx_interface &decoder, + tilemap_get_info_delegate tile_get_info, + u16 tilewidth, + u16 tileheight, + u32 cols, + u32 rows) { // populate managers and devices m_manager = &manager; - m_device = dynamic_cast<tilemap_device *>(this); + m_device = dynamic_cast<device_t *>(this); m_palette = &decoder.palette(); m_next = nullptr; m_user_data = nullptr; @@ -363,9 +372,6 @@ tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decod m_width = cols * tilewidth; m_height = rows * tileheight; - // populate logical <-> memory mappings - m_mapper = mapper; - // initialize tile information geters m_tile_get_info = tile_get_info; @@ -426,6 +432,52 @@ tilemap_t &tilemap_t::init(tilemap_manager &manager, device_gfx_interface &decod // reset everything after a load machine().save().register_postload(save_prepost_delegate(FUNC(tilemap_t::postload), this)); +} + +tilemap_t &tilemap_t::init( + tilemap_manager &manager, + device_gfx_interface &decoder, + tilemap_get_info_delegate tile_get_info, + tilemap_mapper_delegate mapper, + u16 tilewidth, + u16 tileheight, + u32 cols, + u32 rows) +{ + // populate logical <-> memory mappings + m_mapper = mapper; + + init_common(manager, decoder, tile_get_info, tilewidth, tileheight, cols, rows); + + return *this; +} + +tilemap_t &tilemap_t::init( + tilemap_manager &manager, + device_gfx_interface &decoder, + tilemap_get_info_delegate tile_get_info, + tilemap_standard_mapper mapper, + u16 tilewidth, + u16 tileheight, + u32 cols, + u32 rows) +{ + // populate logical <-> memory mappings + switch (mapper) + { + case TILEMAP_SCAN_ROWS: m_mapper.set(*this, FUNC(tilemap_t::scan_rows)); break; + case TILEMAP_SCAN_ROWS_FLIP_X: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_x)); break; + case TILEMAP_SCAN_ROWS_FLIP_Y: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_y)); break; + case TILEMAP_SCAN_ROWS_FLIP_XY: m_mapper.set(*this, FUNC(tilemap_t::scan_rows_flip_xy)); break; + case TILEMAP_SCAN_COLS: m_mapper.set(*this, FUNC(tilemap_t::scan_cols)); break; + case TILEMAP_SCAN_COLS_FLIP_X: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_x)); break; + case TILEMAP_SCAN_COLS_FLIP_Y: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_y)); break; + case TILEMAP_SCAN_COLS_FLIP_XY: m_mapper.set(*this, FUNC(tilemap_t::scan_cols_flip_xy)); break; + default: throw emu_fatalerror("Tilemap init unknown mapper %d", mapper); + } + + init_common(manager, decoder, tile_get_info, tilewidth, tileheight, cols, rows); + return *this; } @@ -1529,14 +1581,13 @@ tilemap_manager::tilemap_manager(running_machine &machine) tilemap_manager::~tilemap_manager() { - // detach all device tilemaps since they will be destroyed - // as subdevices elsewhere + // detach all device tilemaps since they will be destroyed as subdevices elsewhere bool found = true; while (found) { found = false; for (tilemap_t &tmap : m_tilemap_list) - if (tmap.device() != nullptr) + if (tmap.m_device) { found = true; m_tilemap_list.detach(tmap); @@ -1553,28 +1604,16 @@ tilemap_manager::~tilemap_manager() tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_mapper_delegate mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated) { - if (allocated == nullptr) - allocated = global_alloc(tilemap_t); + if (!allocated) + allocated = global_alloc(tilemap_t)(machine().root_device()); return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows)); } tilemap_t &tilemap_manager::create(device_gfx_interface &decoder, tilemap_get_info_delegate tile_get_info, tilemap_standard_mapper mapper, u16 tilewidth, u16 tileheight, u32 cols, u32 rows, tilemap_t *allocated) { - if (allocated == nullptr) - allocated = global_alloc(tilemap_t); - - switch (mapper) - { - case TILEMAP_SCAN_ROWS :return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows), allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_ROWS_FLIP_X:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_x), allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_ROWS_FLIP_Y:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_y), allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_ROWS_FLIP_XY:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_rows_flip_xy),allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_COLS:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols),allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_COLS_FLIP_X:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_x),allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_COLS_FLIP_Y:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_y),allocated), tilewidth, tileheight, cols, rows)); - case TILEMAP_SCAN_COLS_FLIP_XY:return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, tilemap_mapper_delegate(FUNC(tilemap_t::scan_cols_flip_xy),allocated), tilewidth, tileheight, cols, rows)); - default: throw emu_fatalerror("Tilemap manager create unknown mapper %d", mapper); - } + if (!allocated) + allocated = global_alloc(tilemap_t)(machine().root_device()); + return m_tilemap_list.append(allocated->init(*this, decoder, tile_get_info, mapper, tilewidth, tileheight, cols, rows)); } @@ -1615,16 +1654,19 @@ DEFINE_DEVICE_TYPE(TILEMAP, tilemap_device, "tilemap", "Tilemap") //------------------------------------------------- tilemap_device::tilemap_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, TILEMAP, tag, owner, clock), - m_gfxdecode(*this, finder_base::DUMMY_TAG), - m_standard_mapper(TILEMAP_STANDARD_COUNT), - m_bytes_per_entry(0), - m_tile_width(8), - m_tile_height(8), - m_num_columns(64), - m_num_rows(64), - m_transparent_pen_set(false), - m_transparent_pen(0) + : device_t(mconfig, TILEMAP, tag, owner, clock) + , tilemap_t(static_cast<device_t &>(*this)) + , m_gfxdecode(*this, finder_base::DUMMY_TAG) + , m_get_info(*this) + , m_standard_mapper(TILEMAP_STANDARD_COUNT) + , m_mapper(*this) + , m_bytes_per_entry(0) + , m_tile_width(8) + , m_tile_height(8) + , m_num_columns(64) + , m_num_rows(64) + , m_transparent_pen_set(false) + , m_transparent_pen(0) { } @@ -1719,14 +1761,14 @@ void tilemap_device::device_start() throw device_missing_dependencies(); // bind our callbacks - m_get_info.bind_relative_to(*owner()); - m_mapper.bind_relative_to(*owner()); + m_get_info.resolve(); + m_mapper.resolve(); // allocate the tilemap if (m_standard_mapper == TILEMAP_STANDARD_COUNT) - machine().tilemap().create(*m_gfxdecode, m_get_info, m_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, this); + machine().tilemap().create(*m_gfxdecode, m_get_info, m_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, *this); else - machine().tilemap().create(*m_gfxdecode, m_get_info, m_standard_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, this); + machine().tilemap().create(*m_gfxdecode, m_get_info, m_standard_mapper, m_tile_width, m_tile_height, m_num_columns, m_num_rows, *this); // find the memory, if present const memory_share *share = memshare(tag()); |