static void gfxset_update_bitmap(running_machine *machine, ui_gfx_state *state, int xcells, int ycells, gfx_element *gfx) { int set = state->gfxset.set; int cellxpix, cellypix; int x, y; /* compute the number of source pixels in a cell */ cellxpix = 1 + ((state->gfxset.rotate[set] & ORIENTATION_SWAP_XY) ? gfx->height : gfx->width); cellypix = 1 + ((state->gfxset.rotate[set] & ORIENTATION_SWAP_XY) ? gfx->width : gfx->height); /* realloc the bitmap if it is too small */ if (state->bitmap == NULL || state->texture == NULL || state->bitmap->bpp != 32 || state->bitmap->width != cellxpix * xcells || state->bitmap->height != cellypix * ycells) { /* free the old stuff */ if (state->texture != NULL) render_texture_free(state->texture); if (state->bitmap != NULL) bitmap_free(state->bitmap); /* allocate new stuff */ state->bitmap = bitmap_alloc(cellxpix * xcells, cellypix * ycells, BITMAP_FORMAT_ARGB32); state->texture = render_texture_alloc(NULL, NULL); render_texture_set_bitmap(state->texture, state->bitmap, NULL, TEXFORMAT_ARGB32, NULL); /* force a redraw */ state->bitmap_dirty = TRUE; } /* handle the redraw */ if (state->bitmap_dirty) { /* loop over rows */ for (y = 0; y < ycells; y++) { rectangle cellbounds; /* make a rect that covers this row */ cellbounds.min_x = 0; cellbounds.max_x = state->bitmap->width - 1; cellbounds.min_y = y * cellypix; cellbounds.max_y = (y + 1) * cellypix - 1; /* only display if there is data to show */ if (state->gfxset.offset[set] + y * xcells < gfx->total_elements) { /* draw the individual cells */ for (x = 0; x < xcells; x++) { int index = state->gfxset.offset[set] + y * xcells + x; /* update the bounds for this cell */ cellbounds.min_x = x * cellxpix; cellbounds.max_x = (x + 1) * cellxpix - 1; /* only render if there is data */ if (index < gfx->total_elements) gfxset_draw_item(machine, gfx, index, state->bitmap, cellbounds.min_x, cellbounds.min_y, state->gfxset.color[set], state->gfxset.rotate[set]); /* otherwise, fill with transparency */ else bitmap_fill(state->bitmap, &cellbounds, 0); } } /* otherwise, fill with transparency */ else bitmap_fill(state->bitmap, &cellbounds, 0); } /* reset the texture to force an update */ render_texture_set_bitmap(state->texture, state->bitmap, NULL, TEXFORMAT_ARGB32, NULL); state->bitmap_dirty = FALSE; } }
static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state *state, int xcells, int ycells, gfx_element *gfx) { int set = state->gfxset.set; int cellxpix, cellypix; int x, y; /* compute the number of source pixels in a cell */ cellxpix = 1 + ((state->gfxset.rotate[set] & ORIENTATION_SWAP_XY) ? gfx->height() : gfx->width()); cellypix = 1 + ((state->gfxset.rotate[set] & ORIENTATION_SWAP_XY) ? gfx->width() : gfx->height()); /* realloc the bitmap if it is too small */ if (state->bitmap == NULL || state->texture == NULL || state->bitmap->bpp() != 32 || state->bitmap->width() != cellxpix * xcells || state->bitmap->height() != cellypix * ycells) { /* free the old stuff */ machine.render().texture_free(state->texture); global_free(state->bitmap); /* allocate new stuff */ state->bitmap = global_alloc(bitmap_rgb32(cellxpix * xcells, cellypix * ycells)); state->texture = machine.render().texture_alloc(); state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_ARGB32); /* force a redraw */ state->bitmap_dirty = TRUE; } /* handle the redraw */ if (state->bitmap_dirty) { /* loop over rows */ for (y = 0; y < ycells; y++) { rectangle cellbounds; /* make a rect that covers this row */ cellbounds.set(0, state->bitmap->width() - 1, y * cellypix, (y + 1) * cellypix - 1); /* only display if there is data to show */ if (state->gfxset.offset[set] + y * xcells < gfx->elements()) { /* draw the individual cells */ for (x = 0; x < xcells; x++) { int index = state->gfxset.offset[set] + y * xcells + x; /* update the bounds for this cell */ cellbounds.min_x = x * cellxpix; cellbounds.max_x = (x + 1) * cellxpix - 1; /* only render if there is data */ if (index < gfx->elements()) gfxset_draw_item(machine, gfx, index, *state->bitmap, cellbounds.min_x, cellbounds.min_y, state->gfxset.color[set], state->gfxset.rotate[set]); /* otherwise, fill with transparency */ else state->bitmap->fill(0, cellbounds); } } /* otherwise, fill with transparency */ else state->bitmap->fill(0, cellbounds); } /* reset the texture to force an update */ state->texture->set_bitmap(*state->bitmap, state->bitmap->cliprect(), TEXFORMAT_ARGB32); state->bitmap_dirty = FALSE; } }
static void gfxset_update_bitmap(running_machine &machine, ui_gfx_state &state, int xcells, int ycells, gfx_element &gfx) { int dev = state.gfxset.devindex; int set = state.gfxset.set; ui_gfx_info &info = state.gfxdev[dev]; int cellxpix, cellypix; int x, y; // compute the number of source pixels in a cell cellxpix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.height() : gfx.width()); cellypix = 1 + ((info.rotate[set] & ORIENTATION_SWAP_XY) ? gfx.width() : gfx.height()); // realloc the bitmap if it is too small if (state.bitmap == nullptr || state.texture == nullptr || state.bitmap->bpp() != 32 || state.bitmap->width() != cellxpix * xcells || state.bitmap->height() != cellypix * ycells) { // free the old stuff machine.render().texture_free(state.texture); global_free(state.bitmap); // allocate new stuff state.bitmap = global_alloc(bitmap_rgb32(cellxpix * xcells, cellypix * ycells)); state.texture = machine.render().texture_alloc(); state.texture->set_bitmap(*state.bitmap, state.bitmap->cliprect(), TEXFORMAT_ARGB32); // force a redraw state.bitmap_dirty = true; } // handle the redraw if (state.bitmap_dirty) { // loop over rows for (y = 0; y < ycells; y++) { rectangle cellbounds; // make a rect that covers this row cellbounds.set(0, state.bitmap->width() - 1, y * cellypix, (y + 1) * cellypix - 1); // only display if there is data to show if (info.offset[set] + y * xcells < gfx.elements()) { // draw the individual cells for (x = 0; x < xcells; x++) { int index = info.offset[set] + y * xcells + x; // update the bounds for this cell cellbounds.min_x = x * cellxpix; cellbounds.max_x = (x + 1) * cellxpix - 1; // only render if there is data if (index < gfx.elements()) gfxset_draw_item(machine, gfx, index, *state.bitmap, cellbounds.min_x, cellbounds.min_y, info.color[set], info.rotate[set], info.palette[set]); // otherwise, fill with transparency else state.bitmap->fill(0, cellbounds); } } // otherwise, fill with transparency else state.bitmap->fill(0, cellbounds); } // reset the texture to force an update state.texture->set_bitmap(*state.bitmap, state.bitmap->cliprect(), TEXFORMAT_ARGB32); state.bitmap_dirty = false; } }