diff options
author | Ivan Vangelista <mesgnet@yahoo.it> | 2015-03-02 18:27:30 +0100 |
---|---|---|
committer | Ivan Vangelista <mesgnet@yahoo.it> | 2015-03-02 18:27:30 +0100 |
commit | e166b8f2a41e2df6cbecea1b80dc4eca2abb8333 (patch) | |
tree | ef03cd5549b8311919a57414903e3604e9e95f14 | |
parent | 202d316cdb561b63bc89e6d43d17c775fef62ec4 (diff) |
jalblend.c: converted to be a device (nw)
-rw-r--r-- | src/mame/drivers/argus.c | 6 | ||||
-rw-r--r-- | src/mame/drivers/psychic5.c | 2 | ||||
-rw-r--r-- | src/mame/includes/argus.h | 4 | ||||
-rw-r--r-- | src/mame/includes/psychic5.h | 6 | ||||
-rw-r--r-- | src/mame/video/argus.c | 23 | ||||
-rw-r--r-- | src/mame/video/jalblend.c | 193 | ||||
-rw-r--r-- | src/mame/video/jalblend.h | 33 | ||||
-rw-r--r-- | src/mame/video/psychic5.c | 19 |
8 files changed, 160 insertions, 126 deletions
diff --git a/src/mame/drivers/argus.c b/src/mame/drivers/argus.c index 12b6fae8956..4704d27ce10 100644 --- a/src/mame/drivers/argus.c +++ b/src/mame/drivers/argus.c @@ -548,6 +548,8 @@ static MACHINE_CONFIG_START( argus, argus_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", argus) MCFG_PALETTE_ADD("palette", 896) + + MCFG_DEVICE_ADD("blend", JALECO_BLEND, 0) MCFG_VIDEO_START_OVERRIDE(argus_state,argus) MCFG_VIDEO_RESET_OVERRIDE(argus_state,argus) @@ -592,6 +594,8 @@ static MACHINE_CONFIG_START( valtric, argus_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", valtric) MCFG_PALETTE_ADD("palette", 768) + + MCFG_DEVICE_ADD("blend", JALECO_BLEND, 0) MCFG_VIDEO_START_OVERRIDE(argus_state,valtric) MCFG_VIDEO_RESET_OVERRIDE(argus_state,valtric) @@ -636,6 +640,8 @@ static MACHINE_CONFIG_START( butasan, argus_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", butasan) MCFG_PALETTE_ADD("palette", 768) + + MCFG_DEVICE_ADD("blend", JALECO_BLEND, 0) MCFG_VIDEO_START_OVERRIDE(argus_state,butasan) MCFG_VIDEO_RESET_OVERRIDE(argus_state,butasan) diff --git a/src/mame/drivers/psychic5.c b/src/mame/drivers/psychic5.c index 24a29683d40..5998e87ba85 100644 --- a/src/mame/drivers/psychic5.c +++ b/src/mame/drivers/psychic5.c @@ -722,6 +722,8 @@ static MACHINE_CONFIG_START( psychic5, psychic5_state ) MCFG_GFXDECODE_ADD("gfxdecode", "palette", psychic5) MCFG_PALETTE_ADD("palette", 768) + MCFG_DEVICE_ADD("blend", JALECO_BLEND, 0) + MCFG_VIDEO_START_OVERRIDE(psychic5_state,psychic5) MCFG_VIDEO_RESET_OVERRIDE(psychic5_state,psychic5) diff --git a/src/mame/includes/argus.h b/src/mame/includes/argus.h index 695dc528c6a..35710c2655f 100644 --- a/src/mame/includes/argus.h +++ b/src/mame/includes/argus.h @@ -1,3 +1,5 @@ +#include "video/jalblend.h" + class argus_state : public driver_device { public: @@ -8,6 +10,7 @@ public: m_gfxdecode(*this, "gfxdecode"), m_screen(*this, "screen"), m_palette(*this, "palette"), + m_blend(*this, "blend"), m_bg0_scrollx(*this, "bg0_scrollx"), m_bg0_scrolly(*this, "bg0_scrolly"), m_bg1_scrollx(*this, "bg1_scrollx"), @@ -23,6 +26,7 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<screen_device> m_screen; required_device<palette_device> m_palette; + required_device<jaleco_blend_device> m_blend; optional_shared_ptr<UINT8> m_bg0_scrollx; optional_shared_ptr<UINT8> m_bg0_scrolly; diff --git a/src/mame/includes/psychic5.h b/src/mame/includes/psychic5.h index 3a7c8f33195..b422db24962 100644 --- a/src/mame/includes/psychic5.h +++ b/src/mame/includes/psychic5.h @@ -1,4 +1,5 @@ #include "machine/bankdev.h" +#include "video/jalblend.h" class psychic5_state : public driver_device { @@ -10,6 +11,7 @@ public: m_gfxdecode(*this, "gfxdecode"), m_palette(*this, "palette"), m_vrambank(*this, "vrambank"), + m_blend(*this, "blend"), m_spriteram(*this, "spriteram"), m_fg_videoram(*this, "fg_videoram"), m_bg_videoram(*this, "bg_videoram"), @@ -25,6 +27,8 @@ public: required_device<gfxdecode_device> m_gfxdecode; required_device<palette_device> m_palette; optional_device<address_map_bank_device> m_vrambank; + optional_device<jaleco_blend_device> m_blend; + required_shared_ptr<UINT8> m_spriteram; required_shared_ptr<UINT8> m_fg_videoram; required_shared_ptr<UINT8> m_bg_videoram; @@ -83,5 +87,5 @@ public: void change_bg_palette(int color, int lo_offs, int hi_offs); void set_background_palette_intensity(); void draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect); - void draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); + void draw_background(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); //only used by psychic5 }; diff --git a/src/mame/video/argus.c b/src/mame/video/argus.c index 395d8fba4ea..b976d87cee0 100644 --- a/src/mame/video/argus.c +++ b/src/mame/video/argus.c @@ -114,7 +114,6 @@ BG0 palette intensity ( $C47F, $C4FF ) ***************************************************************************/ #include "emu.h" -#include "video/jalblend.h" #include "includes/argus.h" @@ -271,8 +270,6 @@ VIDEO_START_MEMBER(argus_state,argus) /* dummy RAM for back ground */ m_dummy_bg0ram = auto_alloc_array(machine(), UINT8, 0x800); - jal_blend_init(machine(), 1); - save_item(NAME(m_bg_status)); save_item(NAME(m_flipscreen)); save_item(NAME(m_palette_intensity)); @@ -301,8 +298,6 @@ VIDEO_START_MEMBER(argus_state,valtric) m_screen->register_screen_bitmap(m_mosaicbitmap); - jal_blend_init(machine(), 1); - save_item(NAME(m_bg_status)); save_item(NAME(m_flipscreen)); save_item(NAME(m_palette_intensity)); @@ -335,8 +330,6 @@ VIDEO_START_MEMBER(argus_state,butasan) m_butasan_txram = &m_butasan_pagedram[1][0x000]; m_butasan_txbackram = &m_butasan_pagedram[1][0x800]; - jal_blend_init(machine(), 1); - save_item(NAME(m_bg_status)); save_item(NAME(m_flipscreen)); save_item(NAME(m_palette_intensity)); @@ -390,7 +383,7 @@ void argus_state::change_palette(int color, int lo_offs, int hi_offs) { UINT8 lo = m_paletteram[lo_offs]; UINT8 hi = m_paletteram[hi_offs]; - jal_blend_set(color, hi & 0x0f); + m_blend->set(color, hi & 0x0f); m_palette->set_pen_color(color, pal4bit(lo >> 4), pal4bit(lo), pal4bit(hi >> 4)); } @@ -426,7 +419,7 @@ void argus_state::change_bg_palette(int color, int lo_offs, int hi_offs) rgb = rgb_t(r,g,b); } - rgb = jal_blend_func(rgb,irgb,ix); + rgb = m_blend->func(rgb,irgb,ix); m_palette->set_pen_color(color,rgb); } @@ -832,7 +825,7 @@ void argus_state::argus_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &clip } if (priority != pri) - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile, color, @@ -956,7 +949,7 @@ void argus_state::valtric_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl flipy = !flipy; } - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile, color, @@ -1004,7 +997,7 @@ void argus_state::butasan_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl if ((offs >= 0x100 && offs <= 0x2ff) || (offs >= 0x400 && offs <= 0x57f)) { - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile, color, @@ -1018,7 +1011,7 @@ void argus_state::butasan_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl { td = (fx) ? (1 - i) : i; - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile + td, color, @@ -1038,7 +1031,7 @@ void argus_state::butasan_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl else td = (fx) ? (i * 2) + 1 - j : i * 2 + j; - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile + td, color, @@ -1059,7 +1052,7 @@ void argus_state::butasan_draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cl else td = (fx) ? (i * 4) + 3 - j : i * 4 + j; - jal_blend_drawgfx(m_palette, + m_blend->drawgfx(m_palette, bitmap,cliprect,m_gfxdecode->gfx(0), tile + td, color, diff --git a/src/mame/video/jalblend.c b/src/mame/video/jalblend.c index 3e94ad933bd..6b6e6f8917a 100644 --- a/src/mame/video/jalblend.c +++ b/src/mame/video/jalblend.c @@ -14,33 +14,43 @@ #include "emu.h" #include "jalblend.h" +/***************************************************************************** + DEVICE INTERFACE +*****************************************************************************/ -/* each palette entry contains a fourth 'alpha' value */ -static UINT8 *jal_blend_table; -static void jal_blend_reset(running_machine &machine) +const device_type JALECO_BLEND = &device_creator<jaleco_blend_device>; + +jaleco_blend_device::jaleco_blend_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, JALECO_BLEND, "Jaleco Blending Device", tag, owner, clock, "jaleco_blend", __FILE__), + m_table(NULL) { - memset(jal_blend_table, 0, 0xc00); } -void jal_blend_init(running_machine &machine, int enable) +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void jaleco_blend_device::device_start() { - if (enable) - { - jal_blend_table = auto_alloc_array_clear(machine, UINT8, 0xc00); - machine.add_notifier(MACHINE_NOTIFY_RESET, machine_notify_delegate(FUNC(jal_blend_reset), &machine)); - machine.save().save_pointer(NAME(jal_blend_table), 0xc00); - } - else - { - jal_blend_table = NULL; - } + m_table = auto_alloc_array_clear(machine(), UINT8, 0xc00); + + save_pointer(NAME(m_table), 0xc00); } -void jal_blend_set(int color, UINT8 val) +//------------------------------------------------- +// device_reset - device-specific startup +//------------------------------------------------- + +void jaleco_blend_device::device_reset() { - if (jal_blend_table) jal_blend_table[color] = val; + memset(m_table, 0, 0xc00); +} + +void jaleco_blend_device::set(int color, UINT8 val) +{ + m_table[color] = val; } /* @@ -56,7 +66,7 @@ void jal_blend_set(int color, UINT8 val) */ /* basically an add/subtract function with clamping */ -rgb_t jal_blend_func(rgb_t dest, rgb_t addMe, UINT8 alpha) +rgb_t jaleco_blend_device::func(rgb_t dest, rgb_t addMe, UINT8 alpha) { int r, g, b; int ir, ig, ib; @@ -86,100 +96,91 @@ rgb_t jal_blend_func(rgb_t dest, rgb_t addMe, UINT8 alpha) } template<class _BitmapClass> -void jal_blend_drawgfx_common(palette_device &palette,_BitmapClass &dest_bmp,const rectangle &clip,gfx_element *gfx, +void jaleco_blend_device::drawgfx_common(palette_device &palette,_BitmapClass &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color) { - if (jal_blend_table == NULL) - { - gfx->transpen(dest_bmp,clip,code,color,flipx,flipy,offsx,offsy,transparent_color); - return; - } - /* Start drawing */ - if (gfx) - { - const pen_t *pal = &palette.pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); - const UINT8 *alpha = &jal_blend_table[gfx->granularity() * (color % gfx->colors())]; - const UINT8 *source_base = gfx->get_data(code % gfx->elements()); - int x_index_base, y_index, sx, sy, ex, ey; - int xinc, yinc; - - xinc = flipx ? -1 : 1; - yinc = flipy ? -1 : 1; - - x_index_base = flipx ? gfx->width()-1 : 0; - y_index = flipy ? gfx->height()-1 : 0; - - // start coordinates - sx = offsx; - sy = offsy; - - // end coordinates - ex = sx + gfx->width(); - ey = sy + gfx->height(); - - if (sx < clip.min_x) - { // clip left - int pixels = clip.min_x-sx; - sx += pixels; - x_index_base += xinc*pixels; - } - if (sy < clip.min_y) - { // clip top - int pixels = clip.min_y-sy; - sy += pixels; - y_index += yinc*pixels; - } - // NS 980211 - fixed incorrect clipping - if (ex > clip.max_x+1) - { // clip right - ex = clip.max_x+1; - } - if (ey > clip.max_y+1) - { // clip bottom - ey = clip.max_y+1; - } - - if (ex > sx) - { // skip if inner loop doesn't draw anything - int x, y; + const pen_t *pal = &palette.pen(gfx->colorbase() + gfx->granularity() * (color % gfx->colors())); + const UINT8 *alpha = &m_table[gfx->granularity() * (color % gfx->colors())]; + const UINT8 *source_base = gfx->get_data(code % gfx->elements()); + int x_index_base, y_index, sx, sy, ex, ey; + int xinc, yinc; + + xinc = flipx ? -1 : 1; + yinc = flipy ? -1 : 1; + + x_index_base = flipx ? gfx->width()-1 : 0; + y_index = flipy ? gfx->height()-1 : 0; + + // start coordinates + sx = offsx; + sy = offsy; + + // end coordinates + ex = sx + gfx->width(); + ey = sy + gfx->height(); + + if (sx < clip.min_x) + { // clip left + int pixels = clip.min_x-sx; + sx += pixels; + x_index_base += xinc*pixels; + } + if (sy < clip.min_y) + { // clip top + int pixels = clip.min_y-sy; + sy += pixels; + y_index += yinc*pixels; + } + // NS 980211 - fixed incorrect clipping + if (ex > clip.max_x+1) + { // clip right + ex = clip.max_x+1; + } + if (ey > clip.max_y+1) + { // clip bottom + ey = clip.max_y+1; + } - // taken from case 7: TRANSPARENCY_ALPHARANGE - for (y = sy; y < ey; y++) + if (ex > sx) + { // skip if inner loop doesn't draw anything + int x, y; + + // taken from case 7: TRANSPARENCY_ALPHARANGE + for (y = sy; y < ey; y++) + { + const UINT8 *source = source_base + y_index*gfx->rowbytes(); + typename _BitmapClass::pixel_t *dest = &dest_bmp.pix(y); + int x_index = x_index_base; + for (x = sx; x < ex; x++) { - const UINT8 *source = source_base + y_index*gfx->rowbytes(); - typename _BitmapClass::pixel_t *dest = &dest_bmp.pix(y); - int x_index = x_index_base; - for (x = sx; x < ex; x++) + int c = source[x_index]; + if (c != transparent_color) { - int c = source[x_index]; - if (c != transparent_color) + if (alpha[c] & 8) + { + // Comp with clamp + dest[x] = jaleco_blend_device::func(dest[x], pal[c], alpha[c]); + } + else { - if (alpha[c] & 8) - { - // Comp with clamp - dest[x] = jal_blend_func(dest[x], pal[c], alpha[c]); - } - else - { - // Skip the costly alpha step altogether - dest[x] = pal[c]; - } + // Skip the costly alpha step altogether + dest[x] = pal[c]; } - x_index += xinc; } - y_index += yinc; + x_index += xinc; } + y_index += yinc; } } } -void jal_blend_drawgfx(palette_device &palette,bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, +void jaleco_blend_device::drawgfx(palette_device &palette,bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color) -{ jal_blend_drawgfx_common(palette,dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } -void jal_blend_drawgfx(palette_device &palette,bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, +{ jaleco_blend_device::drawgfx_common(palette,dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } +void jaleco_blend_device::drawgfx(palette_device &palette,bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color) -{ jal_blend_drawgfx_common(palette,dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } +{ jaleco_blend_device::drawgfx_common(palette,dest_bmp, clip, gfx, code, color, flipx, flipy, offsx, offsy, transparent_color); } diff --git a/src/mame/video/jalblend.h b/src/mame/video/jalblend.h index 0351a6842b9..2fb6a20b32e 100644 --- a/src/mame/video/jalblend.h +++ b/src/mame/video/jalblend.h @@ -1,10 +1,31 @@ -void jal_blend_init(running_machine &machine, int enable); -void jal_blend_set(int color, UINT8 val); - -rgb_t jal_blend_func(rgb_t dest, rgb_t addMe, UINT8 alpha); -void jal_blend_drawgfx(palette_device &palette,bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, +class jaleco_blend_device : public device_t +{ +public: + jaleco_blend_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + ~jaleco_blend_device() {} + + void set(int color, UINT8 val); + rgb_t func(rgb_t dest, rgb_t addMe, UINT8 alpha); + void drawgfx(palette_device &palette,bitmap_ind16 &dest_bmp,const rectangle &clip,gfx_element *gfx, + UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, + int transparent_color); + void drawgfx(palette_device &palette,bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color); -void jal_blend_drawgfx(palette_device &palette,bitmap_rgb32 &dest_bmp,const rectangle &clip,gfx_element *gfx, + +protected: + // device-level overrides + virtual void device_start(); + virtual void device_reset(); + +private: + /* each palette entry contains a fourth 'alpha' value */ + UINT8 *m_table; + + template<class _BitmapClass> + void drawgfx_common(palette_device &palette,_BitmapClass &dest_bmp,const rectangle &clip,gfx_element *gfx, UINT32 code,UINT32 color,int flipx,int flipy,int offsx,int offsy, int transparent_color); +}; + +extern const device_type JALECO_BLEND;
\ No newline at end of file diff --git a/src/mame/video/psychic5.c b/src/mame/video/psychic5.c index 09b1e85dd0c..6a0b56d3931 100644 --- a/src/mame/video/psychic5.c +++ b/src/mame/video/psychic5.c @@ -7,7 +7,6 @@ ***************************************************************************/ #include "emu.h" -#include "video/jalblend.h" #include "includes/psychic5.h" @@ -25,8 +24,10 @@ void psychic5_state::change_palette(int offset, UINT8* palram, int palbase) UINT8 hi = palram[(offset) | 1]; int color = offset >> 1; - - jal_blend_set(palbase + color, hi & 0x0f); + + if (m_blend) + m_blend->set(palbase + color, hi & 0x0f); + m_palette->set_pen_color(palbase + color, pal4bit(lo >> 4), pal4bit(lo), pal4bit(hi >> 4)); } @@ -56,7 +57,7 @@ void psychic5_state::change_bg_palette(int color, int lo_offs, int hi_offs) { UINT8 val = (r + g + b) / 3; /* Grey */ /* Just leave plain grey */ - m_palette->set_pen_color(color,jal_blend_func(rgb_t(val,val,val),irgb,ix)); + m_palette->set_pen_color(color,m_blend->func(rgb_t(val,val,val),irgb,ix)); } else { @@ -64,7 +65,7 @@ void psychic5_state::change_bg_palette(int color, int lo_offs, int hi_offs) if (!(m_title_screen & 1)) { /* Leave the world as-is */ - m_palette->set_pen_color(color,jal_blend_func(rgb_t(r,g,b),irgb,ix)); + m_palette->set_pen_color(color,m_blend->func(rgb_t(r,g,b),irgb,ix)); } } } @@ -191,7 +192,6 @@ VIDEO_START_MEMBER(psychic5_state,psychic5) m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, 16, 16, 64, 32); m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32); m_fg_tilemap->set_transparent_pen(15); - jal_blend_init(machine(), 1); save_item(NAME(m_title_screen)); @@ -204,7 +204,6 @@ VIDEO_START_MEMBER(psychic5_state,bombsa) m_bg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_bg_tile_info),this), TILEMAP_SCAN_COLS, 16, 16, 128, 32); m_fg_tilemap = &machine().tilemap().create(m_gfxdecode, tilemap_get_info_delegate(FUNC(psychic5_state::get_fg_tile_info),this), TILEMAP_SCAN_COLS, 8, 8, 32, 32); m_fg_tilemap->set_transparent_pen(15); - jal_blend_init(machine(), 0); save_item(NAME(m_bombsa_unknown)); } @@ -223,7 +222,11 @@ VIDEO_RESET_MEMBER(psychic5_state,psychic5) Screen refresh ***************************************************************************/ -#define DRAW_SPRITE(code, sx, sy) jal_blend_drawgfx(m_palette, bitmap, cliprect, m_gfxdecode->gfx(0), code, color, flipx, flipy, sx, sy, 15); +#define DRAW_SPRITE(code, sx, sy) \ + if (m_blend) \ + m_blend->drawgfx(m_palette, bitmap, cliprect, m_gfxdecode->gfx(0), code, color, flipx, flipy, sx, sy, 15); \ + else \ + m_gfxdecode->gfx(0)->transpen(bitmap, cliprect, code, color, flipx, flipy, sx, sy, 15); void psychic5_state::draw_sprites(bitmap_rgb32 &bitmap, const rectangle &cliprect) { |