Tighten grs_bitmap resource rules

This commit is contained in:
Kp 2015-01-17 18:31:40 +00:00
parent fcc4f7dba5
commit af16e4a2a3
2 changed files with 15 additions and 17 deletions

View file

@ -36,6 +36,8 @@ COPYRIGHT 1993-1998 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
#endif #endif
#include "bitmap.h" #include "bitmap.h"
#include "compiler-make_unique.h"
// Allocated a bitmap and makes its data be raw_data that is already somewhere. // Allocated a bitmap and makes its data be raw_data that is already somewhere.
static grs_bitmap_ptr gr_create_bitmap_raw(uint16_t w, uint16_t h, unsigned char * raw_data); static grs_bitmap_ptr gr_create_bitmap_raw(uint16_t w, uint16_t h, unsigned char * raw_data);
@ -56,7 +58,7 @@ grs_bitmap_ptr gr_create_bitmap(uint16_t w, uint16_t h )
grs_bitmap_ptr gr_create_bitmap_raw(uint16_t w, uint16_t h, unsigned char * raw_data ) grs_bitmap_ptr gr_create_bitmap_raw(uint16_t w, uint16_t h, unsigned char * raw_data )
{ {
grs_bitmap_ptr n(new grs_bitmap); auto n = make_unique<grs_main_bitmap>();
gr_init_bitmap(*n.get(), 0, 0, 0, w, h, w, raw_data); gr_init_bitmap(*n.get(), 0, 0, 0, w, h, w, raw_data);
return n; return n;
} }
@ -97,16 +99,11 @@ void gr_init_bitmap_data (grs_bitmap &bm) // TODO: virtulize
grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap &bm, uint16_t x, uint16_t y, uint16_t w, uint16_t h) grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap &bm, uint16_t x, uint16_t y, uint16_t w, uint16_t h)
{ {
grs_subbitmap_ptr n(new grs_bitmap); auto n = make_unique<grs_subbitmap>();
gr_init_sub_bitmap(*n.get(), bm, x, y, w, h); gr_init_sub_bitmap(*n.get(), bm, x, y, w, h);
return n; return n;
} }
void gr_free_bitmap(std::unique_ptr<grs_bitmap> bm)
{
gr_free_bitmap_data(*bm.get());
}
void gr_free_bitmap_data (grs_bitmap &bm) // TODO: virtulize void gr_free_bitmap_data (grs_bitmap &bm) // TODO: virtulize
{ {
#ifdef OGL #ifdef OGL

View file

@ -232,36 +232,37 @@ void gr_init_bitmap(grs_bitmap &bm, uint8_t mode, uint16_t x, uint16_t y, uint16
void gr_init_sub_bitmap (grs_bitmap &bm, grs_bitmap &bmParent, uint16_t x, uint16_t y, uint16_t w, uint16_t h); void gr_init_sub_bitmap (grs_bitmap &bm, grs_bitmap &bmParent, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
void gr_init_bitmap_alloc(grs_bitmap &bm, uint8_t mode, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bytesperline); void gr_init_bitmap_alloc(grs_bitmap &bm, uint8_t mode, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t bytesperline);
void gr_free_bitmap_data(grs_bitmap &bm);
// Free the bitmap and its pixel data // Free the bitmap and its pixel data
void gr_free_bitmap(std::unique_ptr<grs_bitmap> bm); class grs_main_bitmap : public grs_bitmap
struct bitmap_delete
{ {
void operator()(grs_bitmap *p) const public:
grs_main_bitmap() = default;
grs_main_bitmap(const grs_main_bitmap &) = delete;
grs_main_bitmap &operator=(const grs_main_bitmap &) = delete;
~grs_main_bitmap()
{ {
gr_free_bitmap(std::unique_ptr<grs_bitmap>(p)); gr_free_bitmap_data(*this);
} }
}; };
typedef std::unique_ptr<grs_bitmap, bitmap_delete> grs_bitmap_ptr; typedef std::unique_ptr<grs_main_bitmap> grs_bitmap_ptr;
// Allocate a bitmap and its pixel data buffer. // Allocate a bitmap and its pixel data buffer.
grs_bitmap_ptr gr_create_bitmap(uint16_t w,uint16_t h); grs_bitmap_ptr gr_create_bitmap(uint16_t w,uint16_t h);
// Free the bitmap, but not the pixel data buffer // Free the bitmap, but not the pixel data buffer
struct subbitmap_delete : private std::default_delete<grs_bitmap> class grs_subbitmap : public grs_bitmap
{ {
using default_delete<grs_bitmap>::operator();
}; };
typedef std::unique_ptr<grs_bitmap, subbitmap_delete> grs_subbitmap_ptr; typedef std::unique_ptr<grs_subbitmap> grs_subbitmap_ptr;
// Creates a bitmap which is part of another bitmap // Creates a bitmap which is part of another bitmap
grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap &bm, uint16_t x, uint16_t y, uint16_t w, uint16_t h); grs_subbitmap_ptr gr_create_sub_bitmap(grs_bitmap &bm, uint16_t x, uint16_t y, uint16_t w, uint16_t h);
// Free the bitmap's data // Free the bitmap's data
void gr_free_bitmap_data (grs_bitmap &bm);
void gr_init_bitmap_data (grs_bitmap &bm); void gr_init_bitmap_data (grs_bitmap &bm);
void gr_bm_pixel(grs_bitmap &bm, uint_fast32_t x, uint_fast32_t y, uint8_t color ); void gr_bm_pixel(grs_bitmap &bm, uint_fast32_t x, uint_fast32_t y, uint8_t color );