Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*
* _FORMAT.H * * Purpose: * CCharFormatArray and CParaFormatArray * * Authors: * Original RichEdit code: David R. Fulmer * Christian Fortini * Murray Sargent * * Copyright (c) 1995-1997, Microsoft Corporation. All rights reserved. */
#ifndef _FORMAT_H
#define _FORMAT_H
#include "textserv.h"
#define celGrow 8
#define FLBIT 0x80000000
//+-----------------------------------------------------------------------
// Interface IFormatCache
// Interface ICharFormatCache
// Interface IParaFormatCache
//
// Format caches - Used by the host to manage the cache of CHARFORMAT
// and PARAFORMAT structures. Note that these interfaces DON'T derive from
// IUnknown
//------------------------------------------------------------------------
interface IFormatCache { virtual LONG AddRef(LONG iFormat) = 0; virtual LONG Release(LONG iFormat) = 0; virtual void Destroy() = 0; };
template <class FORMAT> interface ITextFormatCache : public IFormatCache { virtual HRESULT Cache(const FORMAT *pFormat, LONG *piFormat) = 0; virtual HRESULT Deref(LONG iFormat, const FORMAT **ppFormat) const = 0; };
interface ICharFormatCache : public ITextFormatCache<CCharFormat> { };
interface IParaFormatCache : public ITextFormatCache<CParaFormat> { };
void ReleaseFormats(LONG iCF, LONG iPF);
HRESULT CreateFormatCaches(); HRESULT DestroyFormatCaches();
// =========================== CFixArray =================================
// This array class ensures stability of the indexes. Elements are freed by
// inserting them in a free list, and the array is never shrunk.
// The first UINT of ELEM is used to store the index of next element in the
// free list.
class CFixArrayBase { private: char* _prgel; // array of elements
LONG _cel; // total count of elements (including free ones)
LONG _ielFirstFree; // - first free element
LONG _cbElem; // size of each element
#ifdef _WIN64
LONG _cbPad; // use in Win64 to make sure each element + RefCount is
// 64 bit aligned.
#else
#define _cbPad 0
#endif
public: CFixArrayBase (LONG cbElem); ~CFixArrayBase () {Free();}
void* Elem(LONG iel) const {return _prgel + iel * _cbElem;} LONG Count() const {return _cel;}
LONG Add (); void Free (LONG ielFirst); void Free ();
HRESULT Deref (LONG iel, const void **ppel) const; LONG AddRef (LONG iel); LONG Release(LONG iel); HRESULT Cache (const void *pel, LONG *piel);
#ifdef DEBUG
void CheckFreeChainFn(LPSTR szFile, INT nLine); #endif
protected: LONG & RefCount(LONG iel);
private: LONG Find (const void *pel); };
template <class ELEM> class CFixArray : public CFixArrayBase { public: CFixArray () : CFixArrayBase (sizeof(ELEM)) {} //@cmember Get ptr to <p iel>'th
ELEM * Elem(LONG iel) const // element
{return (ELEM *)CFixArrayBase::Elem(iel);}
protected: //@cmember Get ptr to <p iel>'th
LONG & RefCount(LONG iel) // ref count
{return CFixArrayBase::RefCount(iel);} };
#ifdef DEBUG
#define CheckFreeChain()\
CheckFreeChainFn(__FILE__, __LINE__) #else
#define CheckFreeChain()
#endif // DEBUG
//================================ CCharFormatArray ==============================
class CCharFormatArray : public CFixArray<CCharFormat>, public ICharFormatCache { protected: LONG Find(const CCharFormat *pCF);
public: CCharFormatArray() : CFixArray<CCharFormat>() {}
// ICharFormatCache
virtual HRESULT Cache(const CCharFormat *pCF, LONG *piCF); virtual HRESULT Deref(LONG iCF, const CCharFormat **ppCF) const; virtual LONG AddRef(LONG iCF); virtual LONG Release(LONG iCF); virtual void Destroy(); };
//=============================== CParaFormatArray ==================================
class CParaFormatArray : public CFixArray<CParaFormat>, public IParaFormatCache { protected: LONG Find(const CParaFormat *pPF);
public: CParaFormatArray() : CFixArray<CParaFormat>() {}
// IParaFormatCache
virtual HRESULT Cache(const CParaFormat *pPF, LONG *piPF); virtual HRESULT Deref(LONG iPF, const CParaFormat **ppPF) const; virtual LONG AddRef(LONG iPF); virtual LONG Release(LONG iPF); virtual void Destroy(); };
//=============================== CTabsArray ==================================
class CTabsArray : public CFixArray<CTabs> { protected: LONG Find(const LONG *prgxTabs, LONG cTab);
public: CTabsArray() : CFixArray<CTabs>() {} ~CTabsArray();
LONG Cache(const LONG *prgxTabs, LONG cTab); const LONG *Deref(LONG iTabs) const;
LONG AddRef (LONG iTabs); LONG Release(LONG iTabs); };
// Access to the format caches
ICharFormatCache *GetCharFormatCache(); IParaFormatCache *GetParaFormatCache(); CTabsArray *GetTabsCache();
#endif
|