Converted FrameBuffer surface storage to unique_ptr. In the process,

I realized that they didn't need to be stored in a map, since the integer
ID was never actually being used.  This must have been part of a proposed
API that I've since deleted??


git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@3062 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
stephena 2014-11-09 15:10:47 +00:00
parent 5d927915ab
commit db139bef1a
7 changed files with 34 additions and 70 deletions

View File

@ -342,10 +342,10 @@ void FrameBufferSDL2::setWindowIcon()
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FBSurface* FrameBufferSDL2::createSurface(uInt32 w, uInt32 h, unique_ptr<FBSurface> FrameBufferSDL2::createSurface(uInt32 w, uInt32 h,
const uInt32* data) const const uInt32* data) const
{ {
return new FBSurfaceSDL2((FrameBufferSDL2&)*this, w, h, data); return make_ptr<FBSurfaceSDL2>((FrameBufferSDL2&)*this, w, h, data);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -151,7 +151,7 @@ class FrameBufferSDL2 : public FrameBuffer
@param h The requested height of the new surface. @param h The requested height of the new surface.
@param data If non-null, use the given data values as a static surface @param data If non-null, use the given data values as a static surface
*/ */
FBSurface* createSurface(uInt32 w, uInt32 h, const uInt32* data) const; unique_ptr<FBSurface> createSurface(uInt32 w, uInt32 h, const uInt32* data) const;
/** /**
Grabs or ungrabs the mouse based on the given boolean value. Grabs or ungrabs the mouse based on the given boolean value.

View File

@ -58,12 +58,6 @@ FrameBuffer::FrameBuffer(OSystem& osystem)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FrameBuffer::~FrameBuffer() FrameBuffer::~FrameBuffer()
{ {
// Free all allocated surfaces
while(!mySurfaceList.empty())
{
delete (*mySurfaceList.begin()).second;
mySurfaceList.erase(mySurfaceList.begin());
}
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -234,19 +228,14 @@ FBInitStatus FrameBuffer::createDisplay(const string& title,
myStatsMsg.w = infoFont().getMaxCharWidth() * 24 + 2; myStatsMsg.w = infoFont().getMaxCharWidth() * 24 + 2;
myStatsMsg.h = (infoFont().getFontHeight() + 2) * 2; myStatsMsg.h = (infoFont().getFontHeight() + 2) * 2;
if(myStatsMsg.surface == nullptr) if(!myStatsMsg.surface)
{ myStatsMsg.surface = allocateSurface(myStatsMsg.w, myStatsMsg.h);
uInt32 surfaceID = allocateSurface(myStatsMsg.w, myStatsMsg.h);
myStatsMsg.surface = surface(surfaceID); if(!myMsg.surface)
} myMsg.surface = allocateSurface((uInt32)kFBMinW, font().getFontHeight()+10);
if(myMsg.surface == nullptr)
{
uInt32 surfaceID = allocateSurface((uInt32)kFBMinW, font().getFontHeight()+10);
myMsg.surface = surface(surfaceID);
}
// Print initial usage message, but only print it later if the status has changed // Print initial usage message, but only print it later if the status has changed
if (myInitializedCount == 1) if(myInitializedCount == 1)
{ {
myOSystem.logMessage(about(), 1); myOSystem.logMessage(about(), 1);
} }
@ -567,23 +556,13 @@ void FrameBuffer::refresh()
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
uInt32 FrameBuffer::allocateSurface(int w, int h, const uInt32* data) FBSurface* FrameBuffer::allocateSurface(int w, int h, const uInt32* data)
{ {
// Create a new surface // Add new surface to the list
FBSurface* surface = createSurface(w, h, data); mySurfaceList.push_back(createSurface(w, h, data));
// Add it to the list // And return a pointer to it (pointer should be treated read-only)
mySurfaceList.insert(make_pair((uInt32)mySurfaceList.size(), surface)); return mySurfaceList.at(mySurfaceList.size() - 1).get();
// Return a reference to it
return (uInt32)mySurfaceList.size() - 1;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FBSurface* FrameBuffer::surface(uInt32 id) const
{
const auto& iter = mySurfaceList.find(id);
return iter != mySurfaceList.end() ? iter->second : nullptr;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -596,9 +575,9 @@ void FrameBuffer::resetSurfaces()
// aware of these restrictions, and act accordingly // aware of these restrictions, and act accordingly
for(auto& s: mySurfaceList) for(auto& s: mySurfaceList)
s.second->free(); s->free();
for(auto& s: mySurfaceList) for(auto& s: mySurfaceList)
s.second->reload(); s->reload();
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -197,25 +197,16 @@ class FrameBuffer
void enableMessages(bool enable); void enableMessages(bool enable);
/** /**
Allocate a new surface with a unique ID. The FrameBuffer class takes Allocate a new surface. The FrameBuffer class takes all responsibility
all responsibility for freeing this surface (ie, other classes must not for freeing this surface (ie, other classes must not delete it directly).
delete it directly).
@param w The requested width of the new surface. @param w The requested width of the new surface.
@param h The requested height of the new surface. @param h The requested height of the new surface.
@param data If non-null, use the given data values as a static surface @param data If non-null, use the given data values as a static surface
@return A unique ID used to identify this surface @return A pointer to a valid surface object, or nullptr.
*/ */
uInt32 allocateSurface(int w, int h, const uInt32* data = 0); FBSurface* allocateSurface(int w, int h, const uInt32* data = 0);
/**
Retrieve the surface associated with the given ID.
@param id The ID for the surface to retrieve.
@return A pointer to a valid surface object, or nullptr.
*/
FBSurface* surface(uInt32 id) const;
/** /**
Returns the current dimensions of the framebuffer image. Returns the current dimensions of the framebuffer image.
@ -401,7 +392,8 @@ class FrameBuffer
@param h The requested height of the new surface. @param h The requested height of the new surface.
@param data If non-null, use the given data values as a static surface @param data If non-null, use the given data values as a static surface
*/ */
virtual FBSurface* createSurface(uInt32 w, uInt32 h, const uInt32* data) const = 0; virtual unique_ptr<FBSurface> createSurface(uInt32 w, uInt32 h,
const uInt32* data) const = 0;
/** /**
Grabs or ungrabs the mouse based on the given boolean value. Grabs or ungrabs the mouse based on the given boolean value.
@ -569,7 +561,7 @@ class FrameBuffer
VariantList myTIAZoomLevels; VariantList myTIAZoomLevels;
// Holds a reference to all the surfaces that have been created // Holds a reference to all the surfaces that have been created
map<uInt32,FBSurface*> mySurfaceList; vector<unique_ptr<FBSurface>> mySurfaceList;
// Holds UI palette data (standard and classic colours) // Holds UI palette data (standard and classic colours)
static uInt32 ourGUIColors[2][kNumColors-256]; static uInt32 ourGUIColors[2][kNumColors-256];

View File

@ -45,8 +45,7 @@ TIASurface::TIASurface(OSystem& system)
myNTSCFilter.loadConfig(myOSystem.settings()); myNTSCFilter.loadConfig(myOSystem.settings());
// Create a surface for the TIA image and scanlines; we'll need them eventually // Create a surface for the TIA image and scanlines; we'll need them eventually
uInt32 tiaID = myFB.allocateSurface(ATARI_NTSC_OUT_WIDTH(kTIAW), kTIAH); myTiaSurface = myFB.allocateSurface(ATARI_NTSC_OUT_WIDTH(kTIAW), kTIAH);
myTiaSurface = myFB.surface(tiaID);
// Generate scanline data, and a pre-defined scanline surface // Generate scanline data, and a pre-defined scanline surface
uInt32 scanData[kScanH]; uInt32 scanData[kScanH];
@ -55,12 +54,10 @@ TIASurface::TIASurface(OSystem& system)
scanData[i] = 0x00000000; scanData[i] = 0x00000000;
scanData[i+1] = 0xff000000; scanData[i+1] = 0xff000000;
} }
uInt32 scanID = myFB.allocateSurface(1, kScanH, scanData); mySLineSurface = myFB.allocateSurface(1, kScanH, scanData);
mySLineSurface = myFB.surface(scanID);
// Base TIA surface for use in taking snapshots in 1x mode // Base TIA surface for use in taking snapshots in 1x mode
uInt32 baseID = myFB.allocateSurface(kTIAW*2, kTIAH); myBaseTiaSurface = myFB.allocateSurface(kTIAW*2, kTIAH);
myBaseTiaSurface = myFB.surface(baseID);
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

View File

@ -40,14 +40,14 @@
Dialog::Dialog(OSystem& instance, DialogContainer& parent, Dialog::Dialog(OSystem& instance, DialogContainer& parent,
int x, int y, int w, int h) int x, int y, int w, int h)
: GuiObject(instance, parent, *this, x, y, w, h), : GuiObject(instance, parent, *this, x, y, w, h),
_mouseWidget(0), _mouseWidget(nullptr),
_focusedWidget(0), _focusedWidget(nullptr),
_dragWidget(0), _dragWidget(nullptr),
_okWidget(0), _okWidget(nullptr),
_cancelWidget(0), _cancelWidget(nullptr),
_visible(false), _visible(false),
_processCancel(false), _processCancel(false),
_surface(0), _surface(nullptr),
_tabID(0) _tabID(0)
{ {
} }
@ -71,10 +71,7 @@ void Dialog::open(bool refresh)
// Technically, this shouldn't be needed until drawDialog(), but some // Technically, this shouldn't be needed until drawDialog(), but some
// dialogs cause drawing to occur within loadConfig() // dialogs cause drawing to occur within loadConfig()
if(_surface == nullptr) if(_surface == nullptr)
{ _surface = instance().frameBuffer().allocateSurface(_w, _h);
uInt32 surfaceID = instance().frameBuffer().allocateSurface(_w, _h);
_surface = instance().frameBuffer().surface(surfaceID);
}
parent().addDialog(this); parent().addDialog(this);
center(); center();

View File

@ -92,8 +92,7 @@ void RomInfoWidget::parseProperties()
// only draw certain parts of it // only draw certain parts of it
if(mySurface == nullptr) if(mySurface == nullptr)
{ {
uInt32 ID = instance().frameBuffer().allocateSurface(320*2, 256*2); mySurface = instance().frameBuffer().allocateSurface(320*2, 256*2);
mySurface = instance().frameBuffer().surface(ID);
mySurface->attributes().smoothing = true; mySurface->attributes().smoothing = true;
mySurface->applyAttributes(); mySurface->applyAttributes();