Use unique_ptr to manage sub bitmaps

This commit is contained in:
Kp 2014-07-22 02:50:01 +00:00
parent 323e796cd0
commit 9778c1a151
4 changed files with 21 additions and 43 deletions

View file

@ -90,13 +90,10 @@ void gr_init_bitmap_data (grs_bitmap *bm) // TODO: virtulize
#endif
}
grs_bitmap *gr_create_sub_bitmap(grs_bitmap *bm, int x, int y, int w, int h )
grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap *bm, int x, int y, int w, int h )
{
grs_bitmap *n;
MALLOC(n, grs_bitmap, 1);
gr_init_sub_bitmap (n, bm, x, y, w, h);
grs_subbitmap_ptr n(new grs_bitmap);
gr_init_sub_bitmap(n.get(), bm, x, y, w, h);
return n;
}
@ -105,15 +102,6 @@ void gr_free_bitmap(std::unique_ptr<grs_bitmap> bm)
gr_free_bitmap_data(bm.get());
}
void gr_free_sub_bitmap(grs_bitmap *bm )
{
if (bm!=NULL)
{
d_free(bm);
}
}
void gr_free_bitmap_data (grs_bitmap *bm) // TODO: virtulize
{
#ifdef OGL

View file

@ -248,16 +248,21 @@ grs_bitmap_ptr gr_create_bitmap(int w,int h);
// Allocated a bitmap and makes its data be raw_data that is already somewhere.
grs_bitmap_ptr gr_create_bitmap_raw(int w, int h, unsigned char * raw_data );
// Free the bitmap, but not the pixel data buffer
struct subbitmap_delete : private std::default_delete<grs_bitmap>
{
using default_delete<grs_bitmap>::operator();
};
typedef std::unique_ptr<grs_bitmap, subbitmap_delete> grs_subbitmap_ptr;
// Creates a bitmap which is part of another bitmap
grs_bitmap *gr_create_sub_bitmap(grs_bitmap *bm,int x,int y,int w, int h);
grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap *bm,int x,int y,int w, int h);
// Free the bitmap's data
void gr_free_bitmap_data (grs_bitmap *bm);
void gr_init_bitmap_data (grs_bitmap *bm);
// Free the bitmap, but not the pixel data buffer
void gr_free_sub_bitmap(grs_bitmap *bm);
void gr_bm_pixel( grs_bitmap * bm, int x, int y, unsigned char color );
void gr_bm_bitblt(int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);
void gr_bm_ubitblt( int w, int h, int dx, int dy, int sx, int sy, grs_bitmap * src, grs_bitmap * dest);

View file

@ -347,7 +347,7 @@ bitmap_index Gauges_hires[MAX_GAUGE_BMS]; // hires gauges
int weapon_box_user[2]={WBU_WEAPON,WBU_WEAPON}; //see WBU_ constants in gauges.h
#endif
grs_bitmap deccpt;
grs_bitmap *WinBoxOverlay[2] = { NULL, NULL }; // Overlay subbitmaps for both weapon boxes
static array<grs_subbitmap_ptr, 2> WinBoxOverlay; // Overlay subbitmaps for both weapon boxes
#define PAGE_IN_GAUGE(x) _page_in_gauge(x)
static inline void _page_in_gauge(int x)
@ -1790,10 +1790,6 @@ static void cockpit_decode_alpha(grs_bitmap *bm)
#ifdef OGL
ogl_ubitmapm_cs (0, 0, -1, -1, &deccpt, 255, F1_0); // render one time to init the texture
#endif
if (WinBoxOverlay[0] != NULL)
gr_free_sub_bitmap(WinBoxOverlay[0]);
if (WinBoxOverlay[1] != NULL)
gr_free_sub_bitmap(WinBoxOverlay[1]);
WinBoxOverlay[0] = gr_create_sub_bitmap(&deccpt,(PRIMARY_W_BOX_LEFT)-2,(PRIMARY_W_BOX_TOP)-2,(PRIMARY_W_BOX_RIGHT-PRIMARY_W_BOX_LEFT+4),(PRIMARY_W_BOX_BOT-PRIMARY_W_BOX_TOP+4));
WinBoxOverlay[1] = gr_create_sub_bitmap(&deccpt,(SECONDARY_W_BOX_LEFT)-2,(SECONDARY_W_BOX_TOP)-2,(SECONDARY_W_BOX_RIGHT-SECONDARY_W_BOX_LEFT)+4,(SECONDARY_W_BOX_BOT-SECONDARY_W_BOX_TOP)+4);
@ -1814,20 +1810,15 @@ static void draw_wbu_overlay()
cockpit_decode_alpha(bm);
if (WinBoxOverlay[0] != NULL)
hud_bitblt(HUD_SCALE_X(PRIMARY_W_BOX_LEFT-2),HUD_SCALE_Y(PRIMARY_W_BOX_TOP-2),WinBoxOverlay[0]);
if (WinBoxOverlay[1] != NULL)
hud_bitblt(HUD_SCALE_X(SECONDARY_W_BOX_LEFT-2),HUD_SCALE_Y(SECONDARY_W_BOX_TOP-2),WinBoxOverlay[1]);
if (WinBoxOverlay[0])
hud_bitblt(HUD_SCALE_X(PRIMARY_W_BOX_LEFT-2),HUD_SCALE_Y(PRIMARY_W_BOX_TOP-2),WinBoxOverlay[0].get());
if (WinBoxOverlay[1])
hud_bitblt(HUD_SCALE_X(SECONDARY_W_BOX_LEFT-2),HUD_SCALE_Y(SECONDARY_W_BOX_TOP-2),WinBoxOverlay[1].get());
}
void close_gauges()
{
if (WinBoxOverlay[0] != NULL)
gr_free_sub_bitmap(WinBoxOverlay[0]);
if (WinBoxOverlay[1] != NULL)
gr_free_sub_bitmap(WinBoxOverlay[1]);
WinBoxOverlay[0] = NULL;
WinBoxOverlay[1] = NULL;
WinBoxOverlay = {};
}
void init_gauges()

View file

@ -103,16 +103,12 @@ struct newmenu
};
grs_bitmap nm_background, nm_background1;
grs_bitmap *nm_background_sub = NULL;
static grs_subbitmap_ptr nm_background_sub;
void newmenu_free_background() {
if (nm_background.bm_data)
{
if (nm_background_sub)
{
gr_free_sub_bitmap(nm_background_sub);
nm_background_sub = NULL;
}
nm_background_sub.reset();
gr_free_bitmap_data (&nm_background);
}
if (nm_background1.bm_data)
@ -186,12 +182,10 @@ void nm_draw_background(int x1, int y1, int x2, int y2 )
if (!init_sub && ((nm_background_sub->bm_w != w*(((float) nm_background.bm_w)/SWIDTH)) || (nm_background_sub->bm_h != h*(((float) nm_background.bm_h)/SHEIGHT))))
{
init_sub=1;
gr_free_sub_bitmap(nm_background_sub);
nm_background_sub = NULL;
}
if (init_sub)
nm_background_sub = gr_create_sub_bitmap(&nm_background,0,0,w*(((float) nm_background.bm_w)/SWIDTH),h*(((float) nm_background.bm_h)/SHEIGHT));
show_fullscr( nm_background_sub );
show_fullscr( nm_background_sub.get() );
gr_set_current_canvas(old);
gr_free_sub_canvas(tmp);