static void mo_render_callback(const UINT16 *data, const struct rectangle *clip, void *param) { const struct GfxElement *gfx = Machine->gfx[0]; struct osd_bitmap *bitmap = (struct osd_bitmap *)param; struct rectangle pf_clip; /* extract data from the various words */ int hflip = data[1] & 0x8000; int code = data[1] & 0x7fff; int xpos = (data[2] >> 7) - atarigen_video_control_state.sprite_xscroll; int color = data[2] & 0x000f; int ypos = -(data[3] >> 7) - atarigen_video_control_state.sprite_yscroll; int hsize = ((data[3] >> 4) & 7) + 1; int vsize = (data[3] & 7) + 1; /* adjust for height */ ypos -= vsize * 8; /* adjust the final coordinates */ xpos &= 0x1ff; ypos &= 0x1ff; if (xpos >= XDIM) xpos -= 0x200; if (ypos >= YDIM) ypos -= 0x200; /* determine the bounding box */ atarigen_mo_compute_clip_8x8(pf_clip, xpos, ypos, hsize, vsize, clip); /* draw the motion object */ atarigen_mo_draw_8x8(bitmap, gfx, code, color, hflip, 0, xpos, ypos, hsize, vsize, clip, TRANSPARENCY_PEN, 0); }
static void mo_render_callback(const UINT16 *data, const struct rectangle *clip, void *param) { struct GfxElement *gfx = Machine->gfx[1]; struct pf_overrender_data overrender_data; struct osd_bitmap *bitmap = param; struct rectangle pf_clip; /* extract data from the various words */ int hflip = data[1] & 0x8000; int code = data[1] & 0x7fff; int xpos = (data[2] >> 7) - atarigen_video_control_state.sprite_xscroll; int priority = (data[2] >> 3) & 1; int color = data[2] & 0x000f; int ypos = -(data[3] >> 7) - atarigen_video_control_state.sprite_yscroll; int hsize = ((data[3] >> 4) & 7) + 1; int vsize = (data[3] & 7) + 1; /* adjust for height */ ypos -= vsize * 8; /* adjust the final coordinates */ xpos &= 0x1ff; ypos &= 0x1ff; if (xpos >= XDIM) xpos -= 0x200; if (ypos >= YDIM) ypos -= 0x200; /* determine the bounding box */ atarigen_mo_compute_clip_8x8(pf_clip, xpos, ypos, hsize, vsize, clip); /* draw an instance of the object in all transparent pens */ atarigen_mo_draw_transparent_8x8(bitmap, gfx, code, hflip, 0, xpos, ypos, hsize, vsize, clip, TRANSPARENCY_PEN, 0); /* and then draw it normally on the temp bitmap */ atarigen_mo_draw_8x8(atarigen_pf_overrender_bitmap, gfx, code, color, hflip, 0, xpos, ypos, hsize, vsize, clip, TRANSPARENCY_NONE, 0); /* overrender the playfield on top of that that */ overrender_data.mo_priority = priority; overrender_data.bitmap = atarigen_pf_overrender_bitmap; atarigen_pf2_process(pf2_overrender_callback, &overrender_data, &pf_clip); /* finally, copy this chunk to the real bitmap */ copybitmap(bitmap, atarigen_pf_overrender_bitmap, 0, 0, 0, 0, &pf_clip, TRANSPARENCY_THROUGH, palette_transparent_pen); #if DEBUG_VIDEO if (show_colors) { int tx = (pf_clip.min_x + pf_clip.max_x) / 2 - 3; int ty = (pf_clip.min_y + pf_clip.max_y) / 2 - 4; drawgfx(bitmap, Machine->uifont, ' ', 0, 0, 0, tx - 2, ty - 2, 0, TRANSPARENCY_NONE, 0); drawgfx(bitmap, Machine->uifont, ' ', 0, 0, 0, tx + 2, ty - 2, 0, TRANSPARENCY_NONE, 0); drawgfx(bitmap, Machine->uifont, ' ', 0, 0, 0, tx - 2, ty + 2, 0, TRANSPARENCY_NONE, 0); drawgfx(bitmap, Machine->uifont, ' ', 0, 0, 0, tx + 2, ty + 2, 0, TRANSPARENCY_NONE, 0); drawgfx(bitmap, Machine->uifont, "0123456789ABCDEF"[priority], 0, 0, 0, tx, ty, 0, TRANSPARENCY_NONE, 0); } #endif }