diff -r 000000000000 -r 6474c204b198 gfx/gl/SurfaceFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/gl/SurfaceFactory.cpp Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,59 @@ +/* -*- Mode: c++; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40; -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "SurfaceFactory.h" + +#include "SharedSurface.h" + +namespace mozilla { +namespace gfx { + +SurfaceFactory::~SurfaceFactory() +{ + while (!mScraps.empty()) { + SharedSurface* cur = mScraps.front(); + mScraps.pop(); + + delete cur; + } +} + +SharedSurface* +SurfaceFactory::NewSharedSurface(const gfx::IntSize& size) +{ + // Attempt to reuse an old surface. + while (!mScraps.empty()) { + SharedSurface* cur = mScraps.front(); + mScraps.pop(); + if (cur->Size() == size) + return cur; + + // Destroy old surfaces of the wrong size. + delete cur; + } + + SharedSurface* ret = CreateShared(size); + + return ret; +} + +// Auto-deletes surfs of the wrong type. +void +SurfaceFactory::Recycle(SharedSurface*& surf) +{ + if (!surf) + return; + + if (surf->Type() == mType) { + mScraps.push(surf); + } else { + delete surf; + } + + surf = nullptr; +} + +} /* namespace gfx */ +} /* namespace mozilla */