gecko-dev/cmd/macfe/central/CIconCache.h

131 строка
4.3 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
//
// CIconCache.h
// Mike Pinkerton, Netscape Communications
//
// Contains the implementation of the CImageCache class which is a small cache of
// images which the FE can pull from with a low overhead. It's good for things
// such as using images for icons in the chrome. Note that this is very
// different from the XP image cache.
//
// The filename is old, owing back to the original name for this class, CIconCache
//
#pragma once
#include <map>
#include <string>
#include "CIconContext.h"
#include "il_types.h"
#include "mimages.h"
//
// class ImageCacheData
//
// Contains all the relevant data for an image loaded from a url (not an FE icon). The
// context controls the loading and notification of when the image has been loaded
// and keeps copies of the FE pixmap data so when imageLib cleans house, we're still ok.
//
class ImageCacheData : public LBroadcaster {
public:
ImageCacheData ( const string & inURL ) ;
~ImageCacheData ( ) ;
// Hold on tight to whatever we need to draw, making copies if necessary.
void CacheThese ( IL_Pixmap* inImage, IL_Pixmap* inMask ) ;
CIconContext* IconContext ( ) const { return mContext; } ;
void IconContextHasGoneAway ( ) { mContext = NULL; } ;
bool ImageAvailable ( ) { return mImage != NULL; } ;
NS_PixMap* Image ( ) const { return mImage; }
NS_PixMap* Mask ( ) const { return mMask; }
private:
// declare these as private so no one can do them.
ImageCacheData ( const ImageCacheData & ) ;
ImageCacheData & operator= ( const ImageCacheData & ) ;
NS_PixMap* mImage;
NS_PixMap* mMask;
CIconContext* mContext;
}; // struct ImageCacheData
//
// class CImageCache
//
// There should only be one of these in the entire application. Users make a request
// by asking the cache for a particular URL. If the URL is not loaded, a new icon context
// will be created and the caller will be placed on a list of listeners for when that
// image is ready to draw. If the image has already been loaded, the caller will either
// be placed on that listener list (for animating images) or be given the data directly
// (for static images).
//
class CImageCache : public LListener
{
public:
enum ELoadResult { kDataPresent, kPutOnWaitingList, kEmptyURL } ;
CImageCache ( ) ;
virtual ~CImageCache ( ) ;
// Make a request for an icon. Will start loading if not present. If an
// empty string is passed in, this will return |kEmptyURL| and nothing
// will be loaded.
ELoadResult RequestIcon ( const string & inURL, const LListener* inClient ) ;
// For images that are already loaded (RequestIcon() returned |kDataPresent|,
// get the data.
void FetchImageData ( const string & inURL, NS_PixMap** outImage, NS_PixMap** outMask ) ;
// Housecleaning. When a static image is finished, the context should go away
// but the data should remain.
void ContextFinished ( const MWContext* inContext ) ;
// a view might be going away before an image is finished loading. If that is
// the case, it needs to be removed from the context's listener list so we don't
// go telling dead objects their image has arrived.
void ListenerGoingAway ( const string & inURL, LListener* inObjectGoingAway ) ;
private:
// declare these private so no one can make a copy of the cache
CImageCache ( const CImageCache & ) ;
CImageCache & operator= ( const CImageCache & ) ;
void ListenToMessage ( MessageT inMessage, void* inData ) ;
// clean out the cache when it gets too big.
void Flush() ;
map<string, ImageCacheData*> mCache;
}; // class CImageCache
// global declaration of our icon cache
CImageCache& gImageCache ( ) ;