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
#include "bitmap.h"
#include "compiler-make_unique.h"
// 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);
@ -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 n(new grs_bitmap);
auto n = make_unique<grs_main_bitmap>();
gr_init_bitmap(*n.get(), 0, 0, 0, w, h, w, raw_data);
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 n(new grs_bitmap);
auto n = make_unique<grs_subbitmap>();
gr_init_sub_bitmap(*n.get(), bm, x, y, w, h);
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
{
#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_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
void gr_free_bitmap(std::unique_ptr<grs_bitmap> bm);
struct bitmap_delete
class grs_main_bitmap : public grs_bitmap
{
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.
grs_bitmap_ptr gr_create_bitmap(uint16_t w,uint16_t h);
// 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
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
void gr_free_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 );