Back to index

lightning-sunbird  0.9+nobinonly
nsRegionPool.cpp
Go to the documentation of this file.
00001 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
00002 /* ***** BEGIN LICENSE BLOCK *****
00003  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
00004  *
00005  * The contents of this file are subject to the Mozilla Public License Version
00006  * 1.1 (the "License"); you may not use this file except in compliance with
00007  * the License. You may obtain a copy of the License at
00008  * http://www.mozilla.org/MPL/
00009  *
00010  * Software distributed under the License is distributed on an "AS IS" basis,
00011  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
00012  * for the specific language governing rights and limitations under the
00013  * License.
00014  *
00015  * The Original Code is mozilla.org code.
00016  *
00017  * The Initial Developer of the Original Code is
00018  * Netscape Communications Corporation.
00019  * Portions created by the Initial Developer are Copyright (C) 1998
00020  * the Initial Developer. All Rights Reserved.
00021  *
00022  * Contributor(s):
00023  *
00024  * Alternatively, the contents of this file may be used under the terms of
00025  * either of the GNU General Public License Version 2 or later (the "GPL"),
00026  * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
00027  * in which case the provisions of the GPL or the LGPL are applicable instead
00028  * of those above. If you wish to allow use of your version of this file only
00029  * under the terms of either the GPL or the LGPL, and not to allow others to
00030  * use your version of this file under the terms of the MPL, indicate your
00031  * decision by deleting the provisions above and replace them with the notice
00032  * and other provisions required by the GPL or the LGPL. If you do not delete
00033  * the provisions above, a recipient may use your version of this file under
00034  * the terms of any one of the MPL, the GPL or the LGPL.
00035  *
00036  * ***** END LICENSE BLOCK ***** */
00037 
00038 #include "nsRegionPool.h"
00039 
00040 
00041 NS_EXPORT nsNativeRegionPool sNativeRegionPool;
00042 
00043 //------------------------------------------------------------------------
00044 
00045 nsNativeRegionPool::nsNativeRegionPool()
00046 {
00047        mRegionSlots = nsnull;
00048        mEmptySlots = nsnull;
00049 }
00050 
00051 //------------------------------------------------------------------------
00052 
00053 nsNativeRegionPool::~nsNativeRegionPool()
00054 {
00055        // Release all of the regions.
00056        if (mRegionSlots != nsnull) {
00057               nsRegionSlot* slot = mRegionSlots;
00058               while (slot != nsnull) {
00059                      ::DisposeRgn(slot->mRegion);
00060                      nsRegionSlot* next = slot->mNext;
00061                      delete slot;
00062                      slot = next;
00063               }
00064        }
00065        
00066        // Release all empty slots.
00067        if (mEmptySlots != nsnull) {
00068               nsRegionSlot* slot = mEmptySlots;
00069               while (slot != nsnull) {
00070                      nsRegionSlot* next = slot->mNext;
00071                      delete slot;
00072                      slot = next;
00073               }
00074        }
00075 }
00076 
00077 //------------------------------------------------------------------------
00078 
00079 RgnHandle nsNativeRegionPool::GetNewRegion()
00080 {
00081        nsRegionSlot* slot = mRegionSlots;
00082        if (slot != nsnull) {
00083               RgnHandle region = slot->mRegion;
00084 
00085               // remove this slot from the free list.
00086               mRegionSlots = slot->mNext;
00087               
00088               // transfer this slot to the empty slot list for reuse.
00089               slot->mRegion = nsnull;
00090               slot->mNext = mEmptySlots;
00091               mEmptySlots = slot;
00092               
00093               // initialize the region. 
00094               ::SetEmptyRgn(region);
00095               return region;
00096        }
00097        
00098        // return a fresh new region. a slot will be created to hold it
00099        // if and when the region is released.
00100        return (::NewRgn());
00101 }
00102 
00103 //------------------------------------------------------------------------
00104 
00105 void nsNativeRegionPool::ReleaseRegion(RgnHandle aRgnHandle)
00106 {
00107        nsRegionSlot* slot = mEmptySlots;
00108        if (slot != nsnull)
00109               mEmptySlots = slot->mNext;
00110        else
00111               slot = new nsRegionSlot;
00112        
00113        if (slot != nsnull) {
00114               // put this region on the region list.
00115               slot->mRegion = aRgnHandle;
00116               slot->mNext = mRegionSlots;
00117               mRegionSlots = slot;
00118        } else {
00119               // couldn't allocate a slot, toss the region.
00120               ::DisposeRgn(aRgnHandle);
00121        }
00122 }
00123