UINT32 laserdisc_device::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { // handle the overlay if present screen_bitmap &overbitmap = m_overbitmap[m_overindex]; if (overbitmap.valid() && (!m_overupdate_ind16.isnull() || !m_overupdate_rgb32.isnull())) { // scale the cliprect to the overlay size rectangle clip(m_overclip); clip.min_y = cliprect.min_y * overbitmap.height() / bitmap.height(); if (cliprect.min_y == screen.visible_area().min_y) clip.min_y = MIN(clip.min_y, m_overclip.min_y); clip.max_y = (cliprect.max_y + 1) * overbitmap.height() / bitmap.height() - 1; // call the update callback if (!m_overupdate_ind16.isnull()) m_overupdate_ind16(screen, overbitmap.as_ind16(), clip); else m_overupdate_rgb32(screen, overbitmap.as_rgb32(), clip); } // if this is the last update, do the rendering if (cliprect.max_y == screen.visible_area().max_y) { // update the texture with the overlay contents if (overbitmap.valid()) m_overtex->set_bitmap(overbitmap, m_overclip, overbitmap.texformat()); // get the laserdisc video bitmap_yuy16 &vidbitmap = get_video(); m_videotex->set_bitmap(vidbitmap, vidbitmap.cliprect(), TEXFORMAT_YUY16); // reset the screen contents screen.container().empty(); // add the video texture if (m_videoenable) screen.container().add_quad(0.0f, 0.0f, 1.0f, 1.0f, rgb_t(0xff,0xff,0xff,0xff), m_videotex, PRIMFLAG_BLENDMODE(BLENDMODE_NONE) | PRIMFLAG_SCREENTEX(1)); // add the overlay if (m_overenable && overbitmap.valid()) { float x0 = 0.5f - 0.5f * m_overscalex + m_overposx; float y0 = 0.5f - 0.5f * m_overscaley + m_overposy; float x1 = x0 + m_overscalex; float y1 = y0 + m_overscaley; screen.container().add_quad(x0, y0, x1, y1, rgb_t(0xff,0xff,0xff,0xff), m_overtex, PRIMFLAG_BLENDMODE(BLENDMODE_ALPHA) | PRIMFLAG_SCREENTEX(1)); } // swap to the next bitmap m_overindex = (m_overindex + 1) % ARRAY_LENGTH(m_overbitmap); } return 0; }
void gpworld_state::draw_pixel(bitmap_rgb32 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip) { if (flip) { x = bitmap.width() - x - 1; y = bitmap.height() - y - 1; } if (cliprect.contains(x, y)) bitmap.pix32(y, x) = m_palette->pen(color); }
INLINE void draw_pixel(running_machine &machine, bitmap_rgb32 &bitmap,const rectangle &cliprect,int x,int y,int color,int flip) { if (flip) { x = bitmap.width() - x - 1; y = bitmap.height() - y - 1; } if (cliprect.contains(x, y)) bitmap.pix32(y, x) = machine.pens[color]; }
static inline void K053936GP_copyroz32clip( running_machine &machine, bitmap_rgb32 &dst_bitmap, bitmap_ind16 &src_bitmap, const rectangle &dst_cliprect, const rectangle &src_cliprect, UINT32 _startx,UINT32 _starty,int _incxx,int _incxy,int _incyx,int _incyy, int tilebpp, int blend, int alpha, int clip, int pixeldouble_output, palette_device *palette ) { static const int colormask[8]={1,3,7,0xf,0x1f,0x3f,0x7f,0xff}; int cy, cx; int ecx; int src_pitch, incxy, incxx; int src_minx, src_maxx, src_miny, src_maxy, cmask; UINT16 *src_base; size_t src_size; const pen_t *pal_base; int dst_ptr; int dst_size; int dst_base2; int tx, dst_pitch; UINT32 *dst_base; int starty, incyy, startx, incyx, ty, sx, sy; incxy = _incxy; incxx = _incxx; incyy = _incyy; incyx = _incyx; starty = _starty; startx = _startx; if (clip) // set source clip range to some extreme values when disabled { src_minx = src_cliprect.min_x; src_maxx = src_cliprect.max_x; src_miny = src_cliprect.min_y; src_maxy = src_cliprect.max_y; } // this simply isn't safe to do! else { src_minx = src_miny = -0x10000; src_maxx = src_maxy = 0x10000; } // set target clip range sx = dst_cliprect.min_x; tx = dst_cliprect.max_x - sx + 1; sy = dst_cliprect.min_y; ty = dst_cliprect.max_y - sy + 1; startx += sx * incxx + sy * incyx; starty += sx * incxy + sy * incyy; // adjust entry points and other loop constants dst_pitch = dst_bitmap.rowpixels(); dst_base = &dst_bitmap.pix32(0); dst_base2 = sy * dst_pitch + sx + tx; ecx = tx = -tx; tilebpp = (tilebpp-1) & 7; pal_base = palette->pens(); cmask = colormask[tilebpp]; src_pitch = src_bitmap.rowpixels(); src_base = &src_bitmap.pix16(0); src_size = src_bitmap.width() * src_bitmap.height(); dst_size = dst_bitmap.width() * dst_bitmap.height(); dst_ptr = 0;//dst_base; cy = starty; cx = startx; if (blend > 0) { dst_ptr += dst_pitch; // draw blended starty += incyy; startx += incyx; do { do { int srcx = (cx >> 16) & 0x1fff; int srcy = (cy >> 16) & 0x1fff; int pixel; UINT32 offs; offs = srcy * src_pitch + srcx; cx += incxx; cy += incxy; if (offs>=src_size) continue; if (srcx < src_minx || srcx > src_maxx || srcy < src_miny || srcy > src_maxy) continue; pixel = src_base[offs]; if (!(pixel & cmask)) continue; if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha); if (pixeldouble_output) { ecx++; if ((dst_ptr+ecx+dst_base2)<dst_size) dst_base[dst_ptr+ecx+dst_base2] = alpha_blend_r32(pal_base[pixel], dst_base[dst_ptr+ecx+dst_base2], alpha); } } while (++ecx < 0); ecx = tx; dst_ptr += dst_pitch; cy = starty; starty += incyy; cx = startx; startx += incyx; } while (--ty); }
/* mix & blend the paletted 16-bit tile and sprite bitmaps into an RGB 32-bit bitmap */ static void blendbitmaps(running_machine &machine, bitmap_rgb32 &dest,bitmap_ind16 &src1,bitmap_ind16 &src2,bitmap_ind16 &src3, int sx,int sy,const rectangle &clip) { int ox; int oy; int ex; int ey; /* check bounds */ ox = sx; oy = sy; ex = sx + src1.width() - 1; if (sx < 0) sx = 0; if (sx < clip.min_x) sx = clip.min_x; if (ex >= dest.width()) ex = dest.width() - 1; if (ex > clip.max_x) ex = clip.max_x; if (sx > ex) return; ey = sy + src1.height() - 1; if (sy < 0) sy = 0; if (sy < clip.min_y) sy = clip.min_y; if (ey >= dest.height()) ey = dest.height() - 1; if (ey > clip.max_y) ey = clip.max_y; if (sy > ey) return; { const pen_t *paldata = machine.pens; UINT32 *end; UINT16 *sd1 = &src1.pix16(0); UINT16 *sd2 = &src2.pix16(0); UINT16 *sd3 = &src3.pix16(0); int sw = ex-sx+1; /* source width */ int sh = ey-sy+1; /* source height */ int sm = src1.rowpixels(); /* source modulo */ UINT32 *dd = &dest.pix32(sy, sx); /* dest data */ int dm = dest.rowpixels(); /* dest modulo */ sd1 += (sx-ox); sd1 += sm * (sy-oy); sd2 += (sx-ox); sd2 += sm * (sy-oy); sd3 += (sx-ox); sd3 += sm * (sy-oy); sm -= sw; dm -= sw; while (sh) { #define BLENDPIXEL(x) if (sd3[x]) { \ if (sd2[x]) { \ dd[x] = paldata[sd2[x] | 0x0400] + paldata[sd3[x]]; \ } else { \ dd[x] = paldata[sd1[x] | 0x0400] + paldata[sd3[x]]; \ } \ } else { \ if (sd2[x]) { \ if (sd2[x] & 0x0800) { \ dd[x] = paldata[sd1[x] | 0x0400] + paldata[sd2[x]]; \ } else { \ dd[x] = paldata[sd2[x]]; \ } \ } else { \ dd[x] = paldata[sd1[x]]; \ } \ } end = dd + sw; while (dd <= end - 8) { BLENDPIXEL(0); BLENDPIXEL(1); BLENDPIXEL(2); BLENDPIXEL(3); BLENDPIXEL(4); BLENDPIXEL(5); BLENDPIXEL(6); BLENDPIXEL(7); dd += 8; sd1 += 8; sd2 += 8; sd3 += 8; } while (dd < end) { BLENDPIXEL(0); dd++; sd1++; sd2++; sd3++; } dd += dm; sd1 += sm; sd2 += sm; sd3 += sm; sh--; #undef BLENDPIXEL } } }