You can subscribe to this list here.
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2003 |
Jan
(20) |
Feb
(14) |
Mar
(17) |
Apr
(60) |
May
(15) |
Jun
(51) |
Jul
(88) |
Aug
(21) |
Sep
(24) |
Oct
(1) |
Nov
(33) |
Dec
(16) |
2004 |
Jan
(27) |
Feb
(5) |
Mar
(6) |
Apr
(50) |
May
(6) |
Jun
(12) |
Jul
(14) |
Aug
(12) |
Sep
(21) |
Oct
(46) |
Nov
(1) |
Dec
(4) |
2005 |
Jan
|
Feb
(2) |
Mar
|
Apr
|
May
(8) |
Jun
(23) |
Jul
|
Aug
(23) |
Sep
(1) |
Oct
(3) |
Nov
|
Dec
|
From: <sil...@li...> - 2003-04-17 22:22:34
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler/Grammar In directory sc8-pr-cvs1:/tmp/cvs-serv23645/Grammar Log Message: Directory /cvsroot/silgraphite/silgraphite/src/GrCompiler/Grammar added to the repository |
From: <sil...@li...> - 2003-04-17 22:11:32
|
Update of /cvsroot/silgraphite/silgraphite/src/GrCompiler In directory sc8-pr-cvs1:/tmp/cvs-serv19703/GrCompiler Log Message: Directory /cvsroot/silgraphite/silgraphite/src/GrCompiler added to the repository |
From: <sil...@li...> - 2003-04-17 22:04:07
|
Update of /cvsroot/silgraphite/silgraphite/src/Generic In directory sc8-pr-cvs1:/tmp/cvs-serv17051/src/Generic Modified Files: Util.cpp Added Files: HashMap.cpp HashMap_i.cpp Set_i.cpp Log Message: Added/modified utility files for GrCompiler --- NEW FILE: HashMap.cpp --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: HashMap.cpp Responsibility: Steve McConnel Last reviewed: Not yet. Description: This file contains the default implementations of the default hashing and equality functors for the various hash map collection classes. ----------------------------------------------------------------------------------------------*/ /*********************************************************************************************** Include files ***********************************************************************************************/ #include "Main.h" #pragma hdrstop #undef THIS_FILE DEFINE_THIS_FILE /*********************************************************************************************** Methods ***********************************************************************************************/ //:End Ignore /*---------------------------------------------------------------------------------------------- Compute a hash value from the bits of an arbitrary object, and return the computed value. @param pKey Pointer to a block of memory (presumably an object of some sort). @param cbKey Number of bytes in the block of memory. ----------------------------------------------------------------------------------------------*/ int HashObj::operator () (void * pKey, int cbKey) { if ((NULL == pKey) || (cbKey <= 0)) return 0; int nHash = 0; int i; if (0 == (cbKey % isizeof(int))) { int cn = cbKey / isizeof(int); int * pn = (int *)pKey; for (i = 0; i < cn; ++i) nHash += (nHash << 4) + *pn++; } else if (0 == (cbKey % isizeof(short))) { int csu = cbKey / isizeof(short); ushort * psu = (ushort *)pKey; for (i = 0; i < csu; ++i) nHash += (nHash << 4) + *psu++; } else { byte * pb = (byte *)pKey; for (i = 0; i < cbKey; ++i) nHash += (nHash << 4) + *pb++; } return nHash; } /*---------------------------------------------------------------------------------------------- Compare the bits of two objects for being the same, returning true if the two objects have exactly the same bits, and otherwise returning false. @param pKey1 Pointer to a block of memory (presumably an object of some sort). @param pKey2 Pointer to another block of memory (presumably an object of some sort). @param cbKey Number of bytes in each block of memory. ----------------------------------------------------------------------------------------------*/ bool EqlObj::operator () (void * pKey1, void * pKey2, int cbKey) { if (pKey1 == pKey2) return true; if ((NULL == pKey1) || (NULL == pKey2)) return false; if (cbKey <= 0) return true; return (0 == memcmp(pKey1, pKey2, cbKey)); } --- NEW FILE: HashMap_i.cpp --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: HashMap_i.cpp Responsibility: Steve McConnel Last reviewed: Not yet. Description: This file provides the implementations of methods for the HashMap template collection classes. It is used as an #include file in any file which explicitly instantiates any particular type of HashMap<K,T>, HashMapStrUni<T>, or HashMapChars<T>. ----------------------------------------------------------------------------------------------*/ #pragma once #ifndef HASHMAP_I_C_INCLUDED #define HASHMAP_I_C_INCLUDED #include "UtilHashMap.h" #include <malloc.h> /*********************************************************************************************** Methods ***********************************************************************************************/ //:End Ignore /*---------------------------------------------------------------------------------------------- Constructor. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> HashMap<K,T,H,Eq>::HashMap() { m_prgihsndBuckets = NULL; m_cBuckets = 0; m_prghsnd = NULL; m_ihsndLim = 0; m_ihsndMax = 0; m_ihsndFirstFree = FreeListIdx(-1); } /*---------------------------------------------------------------------------------------------- Copy constructor. It throws an error if it runs out of memory. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> HashMap<K,T,H,Eq>::HashMap(HashMap<K,T,H,Eq> & hm) { m_prgihsndBuckets = NULL; m_cBuckets= 0; m_prghsnd = NULL; m_ihsndLim = 0; m_ihsndMax = 0; m_ihsndFirstFree = FreeListIdx(-1); hm.CopyTo(this); } /*---------------------------------------------------------------------------------------------- Destructor. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> HashMap<K,T,H,Eq>::~HashMap() { Clear(); } /*---------------------------------------------------------------------------------------------- Return an iterator that references the first key and value stored in the HashMap. If the hash map is empty, Begin returns the same value as End. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> HashMap<K,T,H,Eq>::iterator HashMap<K,T,H,Eq>::Begin() { AssertObj(this); int ihsnd; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) { iterator ithm(this, ihsnd); return ithm; } } return End(); } /*---------------------------------------------------------------------------------------------- Return an iterator that marks the end of the set of keys and values stored in the HashMap. If the HashMap is empty, End returns the same value as Begin. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> HashMap<K,T,H,Eq>::iterator HashMap<K,T,H,Eq>::End() { AssertObj(this); iterator ithm(this, m_ihsndLim); return ithm; } /*---------------------------------------------------------------------------------------------- Add one key and value to the HashMap. Insert potentially invalidates existing iterators for this HashMap. An exception is thrown if there are any errors. @param key Reference to the key object. An internal copy is made of this object. @param value Reference to the object associated with the key. An internal copy is made of this object. @param fOverwrite Optional flag (defaults to false) to allow a value already associated with this key to be replaced by this value. @param pihsndOut Optional pointer to an integer for returning the internal index where the key-value pair is stored. @exception E_INVALIDARG if fOverwrite is not true and the key already is stored with a value in this HashMap. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> void HashMap<K,T,H,Eq>::Insert(K & key, T & value, bool fOverwrite, int * pihsndOut) { AssertObj(this); // Check for initial allocation of memory. if (!m_cBuckets) { int cBuckets = GetPrimeNear(10); m_prgihsndBuckets = (int *)malloc(cBuckets * isizeof(int)); if (!m_prgihsndBuckets) ThrowHr(WarnHr(E_OUTOFMEMORY)); memset(m_prgihsndBuckets, -1, cBuckets * isizeof(int)); m_cBuckets = cBuckets; } if (!m_ihsndMax) { int iMax = 32; m_prghsnd = (HashNode *)malloc(iMax * isizeof(HashNode)); if (!m_prghsnd) ThrowHr(WarnHr(E_OUTOFMEMORY)); memset(m_prghsnd, 0, iMax * isizeof(HashNode)); m_ihsndLim = 0; m_ihsndMax = iMax; m_ihsndFirstFree = FreeListIdx(-1); } // Check whether this key is already used. // If it is, store the value if overwriting is allowed, otherwise return an error value. H hasher; Eq equal; int ihsnd; int nHash = hasher(&key, isizeof(K)); int ie = (unsigned)nHash % m_cBuckets; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&key, &m_prghsnd[ihsnd].GetKey(), isizeof(K))) { if (fOverwrite) { m_prghsnd[ihsnd].PutValue(value); if (pihsndOut) *pihsndOut = ihsnd; AssertObj(this); return; } else { ThrowHr(WarnHr(E_INVALIDARG)); } } } // Check whether to increase the number of buckets to redistribute the wealth. // Calculate the average depth of hash collection chains. // If greater than or equal to two, increase the number of buckets. int chsndFree = 0; int i; for (i = m_ihsndFirstFree; i != FreeListIdx(-1); i = m_prghsnd[FreeListIdx(i)].GetNext()) ++chsndFree; int chsndAvgDepth = (m_ihsndLim - chsndFree) / m_cBuckets; if (chsndAvgDepth > 2) { int cNewBuckets = GetPrimeNear(4 * m_cBuckets); if (cNewBuckets && cNewBuckets > m_cBuckets) { int * pNewBuckets = (int *)realloc(m_prgihsndBuckets, cNewBuckets * isizeof(int)); if (pNewBuckets) { memset(pNewBuckets, -1, cNewBuckets * isizeof(int)); m_cBuckets = cNewBuckets; m_prgihsndBuckets = pNewBuckets; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) { ie = (unsigned)m_prghsnd[ihsnd].GetHash() % m_cBuckets; m_prghsnd[ihsnd].PutNext(m_prgihsndBuckets[ie]); m_prgihsndBuckets[ie] = ihsnd; } } // Recompute the new entry's slot so that it can be stored properly. ie = (unsigned)nHash % m_cBuckets; } } } if (m_ihsndLim < m_ihsndMax) { ihsnd = m_ihsndLim; ++m_ihsndLim; } else if (m_ihsndFirstFree != FreeListIdx(-1)) { ihsnd = FreeListIdx(m_ihsndFirstFree); m_ihsndFirstFree = m_prghsnd[ihsnd].GetNext(); } else { int iNewMax = (!m_ihsndMax) ? 32 : 2 * m_ihsndMax; HashNode * pNewNodes = (HashNode *)realloc(m_prghsnd, iNewMax * isizeof(HashNode)); if (!pNewNodes && iNewMax > 32) { iNewMax = m_ihsndMax + (m_ihsndMax / 2); pNewNodes = (HashNode *)realloc(m_prghsnd, iNewMax * isizeof(HashNode)); if (!pNewNodes) ThrowHr(WarnHr(E_OUTOFMEMORY)); } m_prghsnd = pNewNodes; m_ihsndMax = iNewMax; Assert(m_ihsndLim < m_ihsndMax); ihsnd = m_ihsndLim; ++m_ihsndLim; } // Call constructor on previously allocated memory. new((void *)&m_prghsnd[ihsnd]) HashNode(key, value, nHash, m_prgihsndBuckets[ie]); m_prgihsndBuckets[ie] = ihsnd; if (pihsndOut) *pihsndOut = ihsnd; AssertObj(this); } /*---------------------------------------------------------------------------------------------- Search the HashMap for the given key, and return true if the key is found or false if the key is not found. If the key is found and the given pointer is not NULL, copy the associated value to that memory location. @param key Reference to a key object. @param pvalueRet Pointer to an empty object for storing a copy of the value associated with the key, if one exists. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> bool HashMap<K,T,H,Eq>::Retrieve(K & key, T * pvalueRet) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&key, isizeof(K)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&key, &m_prghsnd[ihsnd].GetKey(), isizeof(K))) { if (pvalueRet) *pvalueRet = m_prghsnd[ihsnd].GetValue(); return true; } } return false; } /*---------------------------------------------------------------------------------------------- Remove the element with the given key from the stored HashMap. This potentially invalidates existing iterators for this HashMap. If the key is not found in the HashMap, then nothing is deleted. @param key Reference to a key object. @return True if the key is found, and something is actually deleted; otherwise, false. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> bool HashMap<K,T,H,Eq>::Delete(K & key) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&key, isizeof(K)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; int ihsndPrev = -1; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&key, &m_prghsnd[ihsnd].GetKey(), isizeof(K))) { if (ihsndPrev == -1) m_prgihsndBuckets[ie] = m_prghsnd[ihsnd].GetNext(); else m_prghsnd[ihsndPrev].PutNext(m_prghsnd[ihsnd].GetNext()); m_prghsnd[ihsnd].~HashNode(); // Ensure member destructors are called. memset(&m_prghsnd[ihsnd], 0, isizeof(HashNode)); m_prghsnd[ihsnd].PutNext(m_ihsndFirstFree); m_ihsndFirstFree = FreeListIdx(ihsnd); AssertObj(this); return true; } ihsndPrev = ihsnd; } return false; } /*---------------------------------------------------------------------------------------------- Free all the memory used by the HashMap. When done, only the minimum amount of bookkeeping memory is still taking up space, and any internal pointers all been set to NULL. The appropriate destructor is called for all key and value objects stored in the HashMap before the memory space is freed. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> void HashMap<K,T,H,Eq>::Clear() { AssertObj(this); if (!m_prgihsndBuckets) return; int ihsnd; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) m_prghsnd[ihsnd].~HashNode(); // Ensure member destructors are called. } free(m_prgihsndBuckets); free(m_prghsnd); m_prgihsndBuckets = NULL; m_cBuckets = 0; m_prghsnd = NULL; m_ihsndLim = 0; m_ihsndMax = 0; m_ihsndFirstFree = FreeListIdx(-1); AssertObj(this); } /*---------------------------------------------------------------------------------------------- Copy the content of one HashMap to another. An exception is thrown if there are any errors. @param hmKT Reference to the other HashMap. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> void HashMap<K,T,H,Eq>::CopyTo(HashMap<K,T,H,Eq> & hmKT) { AssertObj(this); AssertObj(&hmKT); hmKT.Clear(); iterator itmm; for (itmm = Begin(); itmm != End(); ++itmm) hmKT.Insert(itmm->GetKey(), itmm->GetValue()); } /*---------------------------------------------------------------------------------------------- Copy the content of one HashMap to another. An exception is thrown if there are any errors. @param phmKT Pointer to the other HashMap. @exception E_POINTER if phmKT is NULL. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> void HashMap<K,T,H,Eq>::CopyTo(HashMap<K,T,H,Eq> * phmKT) { if (!phmKT) ThrowHr(WarnHr(E_POINTER)); CopyTo(*phmKT); } /*---------------------------------------------------------------------------------------------- If the given key is found in the HashMap, return true, and if the provided index pointer is not NULL, also store the internal index value in the indicated memory location. If the given key is NOT found in the HashMap, return false and ignore the provided index pointer. @param key Reference to a key object. @param pihsndRet Pointer to an integer for returning the internal index where the key-value pair is stored. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> bool HashMap<K,T,H,Eq>::GetIndex(K & key, int * pihsndRet) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&key, isizeof(K)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&key, &m_prghsnd[ihsnd].GetKey(), isizeof(K))) { if (pihsndRet) *pihsndRet = ihsnd; return true; } } return false; } /*---------------------------------------------------------------------------------------------- If the given internal HashMap index is valid, return true, and if the provided pointer to a key object is not NULL, also copy the indexed key to the indicated memory location. If the given internal index is NOT valid, return false, and ignore the provided key object pointer. @param ihsnd Internal index value returned earlier by GetIndex or Insert. @param pkeyRet Pointer to an empty key object for storing a copy of the key found at the indexed location. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> bool HashMap<K,T,H,Eq>::IndexKey(int ihsnd, K * pkeyRet) { AssertObj(this); if ((ihsnd < 0) || (ihsnd >= m_ihsndLim)) return false; if (m_prghsnd[ihsnd].InUse()) { if (pkeyRet) *pkeyRet = m_prghsnd[ihsnd].GetKey(); return true; } else { return false; } } /*---------------------------------------------------------------------------------------------- If the given internal HashMap index is valid, return true, and if the provided pointer to an object is not NULL, also copy the indexed value to the indicated memory location. If the given internal index is NOT valid, return false, and ignore the provided object pointer. @param ihsnd Internal index value returned earlier by GetIndex or Insert. @param pvalueRet Pointer to an empty object for storing a copy of the value found at the indexed location. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> bool HashMap<K,T,H,Eq>::IndexValue(int ihsnd, T * pvalueRet) { AssertObj(this); if (ihsnd < 0 || ihsnd >= m_ihsndLim) return false; if (m_prghsnd[ihsnd].InUse()) { if (pvalueRet) *pvalueRet = m_prghsnd[ihsnd].GetValue(); return true; } else { return false; } } /*---------------------------------------------------------------------------------------------- Return the number of items (key-value pairs) stored in the HashMap. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> int HashMap<K,T,H,Eq>::Size() { AssertObj(this); if (!m_prgihsndBuckets) return 0; int chsndFree = 0; int ihsnd; for (ihsnd = m_ihsndFirstFree; ihsnd != FreeListIdx(-1); ihsnd = m_prghsnd[FreeListIdx(ihsnd)].GetNext()) { ++chsndFree; } return m_ihsndLim - chsndFree; } //:Ignore #ifdef DEBUG /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) currently allocated for the hash map. This is useful only for debugging the hash map mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> int HashMap<K,T,H,Eq>::_BucketCount() { AssertObj(this); return m_cBuckets; } /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) that do not point to a list of HashNode objects. This is useful only for debugging the hash map mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> int HashMap<K,T,H,Eq>::_EmptyBuckets() { AssertObj(this); int ceUnused = 0; int ie; for (ie = 0; ie < m_cBuckets; ++ie) { if (m_prgihsndBuckets[ie] == -1) ++ceUnused; } return ceUnused; } /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) that currently point to a list of HashNode objects in the hash map. This is useful only for debugging the hash map mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> int HashMap<K,T,H,Eq>::_BucketsUsed() { AssertObj(this); int ceUsed = 0; int ie; for (ie = 0; ie < m_cBuckets; ++ie) { if (m_prgihsndBuckets[ie] != -1) ++ceUsed; } return ceUsed; } /*---------------------------------------------------------------------------------------------- Return the length of the longest list of HashNode objects stored in any bucket (hash slot) of the hash map. This is useful only for debugging the hash map mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H, class Eq> int HashMap<K,T,H,Eq>::_FullestBucket() { AssertObj(this); int chsndMax = 0; int chsnd; int ie; int ihsnd; for (ie = 0; ie < m_cBuckets; ++ie) { chsnd = 0; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) ++chsnd; if (chsndMax < chsnd) chsndMax = chsnd; } return chsndMax; } #endif //:End Ignore // Local Variables: // mode:C++ // c-file-style:"cellar" // tab-width:4 // End: #endif /*HASHMAP_I_C_INCLUDED*/ --- NEW FILE: Set_i.cpp --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: Set_i.cpp Responsibility: Steve McConnel Last reviewed: Not yet. Description: This file provides the implementations of the methods for the Set template collection class. It is used as an #include file in any file which explicitly instantiates any particular type of Set<T>. ----------------------------------------------------------------------------------------------*/ #pragma once #ifndef SET_I_C_INCLUDED #define SET_I_C_INCLUDED #include "UtilSet.h" #include <malloc.h> /*********************************************************************************************** Methods. ***********************************************************************************************/ //:End Ignore /*---------------------------------------------------------------------------------------------- Constructor. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> Set<T,H,Eq>::Set() { m_prgihsndBuckets = NULL; m_cBuckets = 0; m_prghsnd = NULL; m_ihsndLim = 0; m_ihsndMax = 0; m_ihsndFirstFree = FreeListIdx(-1); } /*---------------------------------------------------------------------------------------------- Destructor. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> Set<T,H,Eq>::~Set() { Clear(); } /*---------------------------------------------------------------------------------------------- Return an iterator that references the first value stored in the set. If the set is empty, Begin returns the same value as End. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> Set<T,H,Eq>::iterator Set<T,H,Eq>::Begin() { int ihsnd; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) { iterator itset(this, ihsnd); return itset; } } return End(); } /*---------------------------------------------------------------------------------------------- Return an iterator that marks the end of the set of values stored in the set. If the set is empty, End returns the same value as Begin. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> Set<T,H,Eq>::iterator Set<T,H,Eq>::End() { iterator itset(this, m_ihsndLim); return itset; } /*---------------------------------------------------------------------------------------------- Add one value to the set. Insert potentially invalidates existing iterators for this set. An exception is thrown if there are any errors. @param value Reference to a copy of the object to store in the set. An internal copy is made of this object. @param pihsndOut Optional pointer to an integer for returning the internal index where the object is stored. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> void Set<T,H,Eq>::Insert(T & value, int * pihsndOut) { AssertObj(this); // Check for initial allocation of memory. if (!m_cBuckets) { int cBuckets = GetPrimeNear(10); m_prgihsndBuckets = (int *)malloc(cBuckets * isizeof(int)); if (!m_prgihsndBuckets) ThrowHr(WarnHr(E_OUTOFMEMORY)); memset(m_prgihsndBuckets, -1, cBuckets * isizeof(int)); m_cBuckets = cBuckets; } if (!m_ihsndMax) { int iMax = 32; m_prghsnd = (HashNode *)malloc(iMax * isizeof(HashNode)); if (!m_prghsnd) ThrowHr(WarnHr(E_OUTOFMEMORY)); memset(m_prghsnd, 0, iMax * isizeof(HashNode)); m_ihsndLim = 0; m_ihsndMax = iMax; m_ihsndFirstFree = FreeListIdx(-1); } // Check whether this value is already present. If so, do nothing. H hasher; Eq equal; int ihsnd; int nHash = hasher(&value, isizeof(T)); int ie = (unsigned)nHash % m_cBuckets; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&value, &m_prghsnd[ihsnd].GetValue(), isizeof(T))) { return; } } // Check whether to increase the number of buckets to redistribute the wealth. // Calculate the average depth of hash collection chains. // If greater than or equal to two, increase the number of buckets. int chsndFree = 0; int i; for (i = m_ihsndFirstFree; i != FreeListIdx(-1); i = m_prghsnd[FreeListIdx(i)].GetNext()) ++chsndFree; int chsndAvgDepth = (m_ihsndLim - chsndFree) / m_cBuckets; if (chsndAvgDepth > 2) { int cNewBuckets = GetPrimeNear(4 * m_cBuckets); if (cNewBuckets && cNewBuckets > m_cBuckets) { int * pNewBuckets = NULL; if (cNewBuckets) pNewBuckets = (int *)realloc(m_prgihsndBuckets, cNewBuckets * isizeof(int)); if (pNewBuckets) { memset(pNewBuckets, -1, cNewBuckets * isizeof(int)); m_cBuckets = cNewBuckets; m_prgihsndBuckets = pNewBuckets; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) { ie = (unsigned)m_prghsnd[ihsnd].GetHash() % m_cBuckets; m_prghsnd[ihsnd].PutNext(m_prgihsndBuckets[ie]); m_prgihsndBuckets[ie] = ihsnd; } } // Recompute the new entry's slot so that it can be stored properly. ie = (unsigned)nHash % m_cBuckets; } } } if (m_ihsndLim < m_ihsndMax) { ihsnd = m_ihsndLim; ++m_ihsndLim; } else if (m_ihsndFirstFree != FreeListIdx(-1)) { ihsnd = FreeListIdx(m_ihsndFirstFree); m_ihsndFirstFree = m_prghsnd[ihsnd].GetNext(); } else { int iNewMax = (!m_ihsndMax) ? 32 : 2 * m_ihsndMax; HashNode * pNewNodes = (HashNode *)realloc(m_prghsnd, iNewMax * isizeof(HashNode)); if (!pNewNodes && iNewMax > 32) { iNewMax = m_ihsndMax + (m_ihsndMax / 2); pNewNodes = (HashNode *)realloc(m_prghsnd, iNewMax * isizeof(HashNode)); if (!pNewNodes) ThrowHr(WarnHr(E_OUTOFMEMORY)); } m_prghsnd = pNewNodes; m_ihsndMax = iNewMax; Assert(m_ihsndLim < m_ihsndMax); ihsnd = m_ihsndLim; ++m_ihsndLim; } // Call constructor on previously allocated memory. new((void *)&m_prghsnd[ihsnd]) HashNode(value, nHash, m_prgihsndBuckets[ie]); m_prgihsndBuckets[ie] = ihsnd; if (pihsndOut) *pihsndOut = ihsnd; AssertObj(this); } /*---------------------------------------------------------------------------------------------- Return true if the given value is found in the set, or false if it is not found. @param value Reference to a copy of the object to search for in the set. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> bool Set<T,H,Eq>::IsMember(T & value) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&value, isizeof(T)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&value, &m_prghsnd[ihsnd].GetValue(), isizeof(T))) { return true; } } return false; } /*---------------------------------------------------------------------------------------------- Remove the element with the given value from the stored set. This potentially invalidates existing iterators for this set. If the value is not found in the set, then nothing is deleted. @param value Reference to a copy of the object to delete from the set. @return True if the value is found, and something is actually deleted; otherwise, false. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> bool Set<T,H,Eq>::Delete(T & value) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&value, isizeof(T)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; int ihsndPrev = -1; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&value, &m_prghsnd[ihsnd].GetValue(), isizeof(T))) { if (ihsndPrev == -1) m_prgihsndBuckets[ie] = m_prghsnd[ihsnd].GetNext(); else m_prghsnd[ihsndPrev].PutNext(m_prghsnd[ihsnd].GetNext()); m_prghsnd[ihsnd].~HashNode(); // Ensure member destructors are called. memset(&m_prghsnd[ihsnd], 0, isizeof(HashNode)); m_prghsnd[ihsnd].PutNext(m_ihsndFirstFree); m_ihsndFirstFree = FreeListIdx(ihsnd); AssertObj(this); return true; } ihsndPrev = ihsnd; } return false; } /*---------------------------------------------------------------------------------------------- Free all the memory used by the set. When done, only the minimum amount of bookkeeping memory is still taking up space, and any internal pointers all been set to NULL. The appropriate destructor is called for all key and value objects stored in the set before the memory space is freed. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> void Set<T,H,Eq>::Clear() { AssertObj(this); if (!m_prgihsndBuckets) return; int ihsnd; for (ihsnd = 0; ihsnd < m_ihsndLim; ++ihsnd) { if (m_prghsnd[ihsnd].InUse()) m_prghsnd[ihsnd].~HashNode(); // Ensure member destructors are called. } free(m_prgihsndBuckets); free(m_prghsnd); m_prgihsndBuckets = NULL; m_cBuckets = 0; m_prghsnd = NULL; m_ihsndLim = 0; m_ihsndMax = 0; m_ihsndFirstFree = FreeListIdx(-1); AssertObj(this); } /*---------------------------------------------------------------------------------------------- If the given value is found in the set, return true, and if the provided index pointer is not NULL, also store the value's internal index in the indicated memory location. If the given value is NOT found in the set, return false and ignore the provided index pointer. @param value Reference to a copy of the object to search for in the set. @param pihsndRet Optional pointer to an integer for storing the internal index value. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> bool Set<T,H,Eq>::GetIndex(T & value, int * pihsndRet) { AssertObj(this); if (!m_prgihsndBuckets) return false; H hasher; Eq equal; int nHash = hasher(&value, isizeof(T)); int ie = (unsigned)nHash % m_cBuckets; int ihsnd; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) { if ((nHash == m_prghsnd[ihsnd].GetHash()) && equal(&value, &m_prghsnd[ihsnd].GetValue(), isizeof(T))) { if (pihsndRet) *pihsndRet = ihsnd; return true; } } return false; } /*---------------------------------------------------------------------------------------------- If the given index is valid, return true, and if the provided pointer to a T object is not NULL, also copy the indexed value to the indicated memory location. If the given index is NOT valid, return false, and ignore the provided value object pointer. @param ihsnd Index into the set's internal data structure. @param pvalueRet Optional pointer to a place for storing a copy of the stored value. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> bool Set<T,H,Eq>::IndexValue(int ihsnd, T * pvalueRet) { AssertObj(this); if (ihsnd < 0 || ihsnd >= m_ihsndLim) return false; if (m_prghsnd[ihsnd].InUse()) { if (pvalueRet) *pvalueRet = m_prghsnd[ihsnd].GetValue(); return true; } else { return false; } } /*---------------------------------------------------------------------------------------------- Return the number of items stored in the set. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> int Set<T,H,Eq>::Size() { AssertObj(this); if (!m_prgihsndBuckets) return 0; int chsndFree = 0; int ihsnd; for (ihsnd = m_ihsndFirstFree; ihsnd != FreeListIdx(-1); ihsnd = m_prghsnd[FreeListIdx(ihsnd)].GetNext()) { ++chsndFree; } return m_ihsndLim - chsndFree; } /*---------------------------------------------------------------------------------------------- Return true if the sets are equal, in the sense that they are the same size, and every member of *this is a member of the argument set. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> bool Set<T,H,Eq>::Equals(Set<T, H, Eq> & itset) { AssertObj(this); if (Size() != itset.Size()) return false; iterator it = Begin(); iterator itEnd = End(); for ( ; it != itEnd; ++it) { if (!itset.IsMember(*it)) return false; } return true; } #ifdef DEBUG /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) currently allocated for the set. This is useful only for debugging the set mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> int Set<T,H,Eq>::_BucketCount() { AssertObj(this); return m_cBuckets; } /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) that do not point to a list of HashNode objects. This is useful only for debugging the set mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> int Set<T,H,Eq>::_EmptyBuckets() { AssertObj(this); int ceUnused = 0; int ie; for (ie = 0; ie < m_cBuckets; ++ie) { if (m_prgihsndBuckets[ie] == -1) ++ceUnused; } return ceUnused; } /*---------------------------------------------------------------------------------------------- Return the number of buckets (hash slots) that currently point to a list of HashNode objects in the set. This is useful only for debugging the set mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> int Set<T,H,Eq>::_BucketsUsed() { AssertObj(this); int ceUsed = 0; int ie; for (ie = 0; ie < m_cBuckets; ++ie) { if (m_prgihsndBuckets[ie] != -1) ++ceUsed; } return ceUsed; } /*---------------------------------------------------------------------------------------------- Return the length of the longest list of HashNode objects stored in any bucket (hash slot) of the set. This is useful only for debugging the set mechanism itself. ----------------------------------------------------------------------------------------------*/ template<class T, class H, class Eq> int Set<T,H,Eq>::_FullestBucket() { AssertObj(this); int chsndMax = 0; int chsnd; int ie; int ihsnd; for (ie = 0; ie < m_cBuckets; ++ie) { chsnd = 0; for (ihsnd = m_prgihsndBuckets[ie]; ihsnd != -1; ihsnd = m_prghsnd[ihsnd].GetNext()) ++chsnd; if (chsndMax < chsnd) chsndMax = chsnd; } return chsndMax; } #endif /*DEBUG*/ // Local Variables: // mode:C++ // c-file-style:"cellar" // tab-width:4 // End: #endif /*SET_I_C_INCLUDED*/ Index: Util.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/Util.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Util.cpp 1 Apr 2003 09:00:02 -0000 1.2 +++ Util.cpp 17 Apr 2003 22:04:03 -0000 1.3 @@ -121,3 +121,134 @@ #endif //!NO_ASM } + +/*********************************************************************************************** + Integer utilities. +***********************************************************************************************/ + +/* + * table of powers of 2, and largest prime smaller than each power of 2 + * n 2**n prime diff + * --- ---------- ---------- ---- + * 2: 4 3 ( -1) + * 3: 8 7 ( -1) + * 4: 16 13 ( -3) + * 5: 32 31 ( -1) + * 6: 64 61 ( -3) + * 7: 128 127 ( -1) + * 8: 256 251 ( -5) + * 9: 512 509 ( -3) + * 10: 1024 1021 ( -3) + * 11: 2048 2039 ( -9) + * 12: 4096 4093 ( -3) + * 13: 8192 8191 ( -1) + * 14: 16384 16381 ( -3) + * 15: 32768 32749 (-19) + * 16: 65536 65521 (-15) + * 17: 131072 131071 ( -1) + * 18: 262144 262139 ( -5) + * 19: 524288 524287 ( -1) + * 20: 1048576 1048573 ( -3) + * 21: 2097152 2097143 ( -9) + * 22: 4194304 4194301 ( -3) + * 23: 8388608 8388593 (-15) + * 24: 16777216 16777213 ( -3) + * 25: 33554432 33554393 (-39) + * 26: 67108864 67108859 ( -5) + * 27: 134217728 134217689 (-39) + * 28: 268435456 268435399 (-57) + * 29: 536870912 536870909 ( -3) + * 30: 1073741824 1073741789 (-35) + * 31: 2147483648 2147483647 ( -1) + * 32: 4294967296 4294967291 ( -5) + */ +const static uint g_rguPrimes[] = { + 3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, + 262139, 524287, 1048573, 2097143, 4194301, 8388593, 16777213, 33554393, 67108859, + 134217689, 268435399, 536870909, 1073741789, 2147483647, 4294967291 +}; + + +/*---------------------------------------------------------------------------------------------- + Returns the prime in g_rguPrimes that is closest to u. +----------------------------------------------------------------------------------------------*/ +uint GetPrimeNear(uint u) +{ + int cu = isizeof(g_rguPrimes) / isizeof(uint); + int iuMin; + int iuLim; + int iu; + + for (iuMin = 0, iuLim = cu; iuMin < iuLim; ) + { + iu = (iuMin + iuLim) / 2; + if (u > g_rguPrimes[iu]) + iuMin = iu + 1; + else + iuLim = iu; + } + Assert(iuMin == cu || iuMin < cu && u <= g_rguPrimes[iuMin]); + Assert(iuMin == 0 || iuMin > 0 && u > g_rguPrimes[iuMin - 1]); + + if (!iuMin) + return g_rguPrimes[0]; + if (iuMin == cu) + return g_rguPrimes[cu - 1]; + if (g_rguPrimes[iuMin] - u < u - g_rguPrimes[iuMin - 1]) + return g_rguPrimes[iuMin]; + return g_rguPrimes[iuMin - 1]; +} + + +/*---------------------------------------------------------------------------------------------- + Returns the prime in g_rguPrimes that is larger than u or is the largest in the list. +----------------------------------------------------------------------------------------------*/ +uint GetLargerPrime(uint u) +{ + int cu = isizeof(g_rguPrimes) / isizeof(uint); + int iuMin; + int iuLim; + int iu; + + for (iuMin = 0, iuLim = cu; iuMin < iuLim; ) + { + iu = (iuMin + iuLim) / 2; + if (u >= g_rguPrimes[iu]) + iuMin = iu + 1; + else + iuLim = iu; + } + Assert(iuMin == cu || iuMin < cu && u < g_rguPrimes[iuMin]); + Assert(iuMin == 0 || iuMin > 0 && u >= g_rguPrimes[iuMin - 1]); + + if (iuMin == cu) + return g_rguPrimes[cu - 1]; + return g_rguPrimes[iuMin]; +} + + +/*---------------------------------------------------------------------------------------------- + Returns the prime in g_rguPrimes that is smaller than u or is the smallest in the list. +----------------------------------------------------------------------------------------------*/ +uint GetSmallerPrime(uint u) +{ + int cu = isizeof(g_rguPrimes) / isizeof(uint); + int iuMin; + int iuLim; + int iu; + + for (iuMin = 0, iuLim = cu; iuMin < iuLim; ) + { + iu = (iuMin + iuLim) / 2; + if (u > g_rguPrimes[iu]) + iuMin = iu + 1; + else + iuLim = iu; + } + Assert(iuMin == cu || iuMin < cu && u <= g_rguPrimes[iuMin]); + Assert(iuMin == 0 || iuMin > 0 && u > g_rguPrimes[iuMin - 1]); + + if (!iuMin) + return g_rguPrimes[0]; + return g_rguPrimes[iuMin - 1]; +} |
From: <sil...@li...> - 2003-04-17 22:04:05
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv17051/include Modified Files: GrCommon.h GrPlatform.h Added Files: UtilHashMap.h UtilInt.h UtilSet.h Log Message: Added/modified utility files for GrCompiler --- NEW FILE: UtilHashMap.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: HashMap.h Responsibility: Steve McConnel Last reviewed: Not yet. Description: This provides a set of template collection classes to replace std::map. Their primary reason to exist is to allow explicit checking for internal memory allocation failures. ----------------------------------------------------------------------------------------------*/ #pragma once #ifndef HASHMAP_H_INCLUDED #define HASHMAP_H_INCLUDED //:End Ignore /*---------------------------------------------------------------------------------------------- Functor class for computing a hash value from an arbitrary object. Hungarian: hsho ----------------------------------------------------------------------------------------------*/ class HashObj { public: int operator () (void * pKey, int cbKey); }; /*---------------------------------------------------------------------------------------------- Functor class for comparing two arbitrary objects (of the same class) for equality. Hungarian: eqlo ----------------------------------------------------------------------------------------------*/ class EqlObj { public: bool operator () (void * pKey1, void * pKey2, int cbKey); }; /*---------------------------------------------------------------------------------------------- Hash map template collection class whose keys are objects of an arbitrary class. Hungarian: hm[K][T] ----------------------------------------------------------------------------------------------*/ template<class K, class T, class H = HashObj, class Eq = EqlObj> class HashMap { public: //:> Member classes /*------------------------------------------------------------------------------------------ This is the basic data structure for storing one key-value pair in a hash map. In order to handle hash collisions, this structure is a member of a linked list. Hungarian: hsnd ------------------------------------------------------------------------------------------*/ class HashNode { public: //:> Constructors/destructors/etc. HashNode(void) : m_key(K()), m_value(T()), m_nHash(0), m_ihsndNext(0) { } HashNode(K & key, T & value, int nHash, int ihsndNext = -1) : m_key(key), m_value(value), m_nHash(nHash), m_ihsndNext(ihsndNext) { } ~HashNode() { } //:> Member variable access void PutKey(K & key) { m_key = key; } K & GetKey() { return m_key; } void PutValue(T & value) { m_value = value; } T & GetValue() { return m_value; } void PutHash(int nHash) { m_nHash = nHash; } int GetHash() { return m_nHash; } void PutNext(int ihsndNext) { m_ihsndNext = ihsndNext; } int GetNext() { return m_ihsndNext; } /*-------------------------------------------------------------------------------------- Check whether the given HashNode is being used. --------------------------------------------------------------------------------------*/ bool InUse() { return m_ihsndNext >= -1; } protected: //:> Member variables K m_key; T m_value; int m_nHash; int m_ihsndNext; // -1 means end of list, -(ihsnd + 3) for free list members }; /*------------------------------------------------------------------------------------------ This provides an iterator for stepping through all HashNodes stored in the hash map. This is useful primarily for saving the contents of a hash map to a file. Hungarian: ithm[K][T] ------------------------------------------------------------------------------------------*/ class iterator { public: // Constructors/destructors/etc. iterator() : m_phmParent(NULL), m_ihsnd(0) { } iterator(HashMap<K,T,H,Eq> * phm, int ihsnd) : m_phmParent(phm), m_ihsnd(ihsnd) { } iterator(const iterator & v) : m_phmParent(v.m_phmParent), m_ihsnd(v.m_ihsnd) { } ~iterator() { } // Other public methods iterator & operator = (const iterator & ithm) { m_phmParent = ithm.m_phmParent; m_ihsnd = ithm.m_ihsnd; return *this; } T & operator * (void) { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); return m_phmParent->m_prghsnd[m_ihsnd].GetValue(); } HashNode * operator -> (void) { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); return &m_phmParent->m_prghsnd[m_ihsnd]; } iterator & operator ++ (void) { Assert(m_phmParent); ++m_ihsnd; // make sure that this new HashNode is actually in use while (m_ihsnd < m_phmParent->m_ihsndLim) { if (m_phmParent->m_prghsnd[m_ihsnd].InUse()) return *this; // skip to the next one and check it ++m_ihsnd; } if (m_ihsnd > m_phmParent->m_ihsndLim) m_ihsnd = m_phmParent->m_ihsndLim; return *this; } bool operator == (const iterator & ithm) { return (m_phmParent == ithm.m_phmParent) && (m_ihsnd == ithm.m_ihsnd); } bool operator != (const iterator & ithm) { return (m_phmParent != ithm.m_phmParent) || (m_ihsnd != ithm.m_ihsnd); } T & GetValue(void) { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); Assert(m_phmParent->m_prghsnd[m_ihsnd].InUse()); return m_phmParent->m_prghsnd[m_ihsnd].GetValue(); } K & GetKey(void) { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); Assert(m_phmParent->m_prghsnd[m_ihsnd].InUse()); return m_phmParent->m_prghsnd[m_ihsnd].GetKey(); } int GetHash() { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); Assert(m_phmParent->m_prghsnd[m_ihsnd].InUse()); return m_phmParent->m_prghsnd[m_ihsnd].GetHash(); } int GetIndex() { Assert(m_phmParent); Assert(m_phmParent->m_prghsnd); Assert(m_ihsnd < m_phmParent->m_ihsndLim); Assert(m_phmParent->m_prghsnd[m_ihsnd].InUse()); return m_ihsnd; } protected: //:> Member variables HashMap<K,T,H,Eq> * m_phmParent; int m_ihsnd; }; friend class iterator; //:> Constructors/destructors/etc. HashMap(); ~HashMap(); HashMap(HashMap<K,T,H,Eq> & hm); //:> Other public methods iterator Begin(); iterator End(); void Insert(K & key, T & value, bool fOverwrite = false, int * pihsndOut = NULL); bool Retrieve(K & key, T * pvalueRet); bool Delete(K & key); void Clear(); void CopyTo(HashMap<K,T,H,Eq> & hmKT); void CopyTo(HashMap<K,T,H,Eq> * phmKT); bool GetIndex(K & key, int * pihsndRet); bool IndexKey(int ihsnd, K * pkeyRet); bool IndexValue(int ihsnd, T * pvalueRet); int Size(); /*------------------------------------------------------------------------------------------ The assignment operator allows an entire hashmap to be assigned as the value of another hashmap. It throws an error if it runs out of memory. @return a reference to this hashmap. (That is how the assignment operator is defined!) @param hm is a reference to the other hashmap. ------------------------------------------------------------------------------------------*/ HashMap<K,T,H,Eq> & operator = (HashMap<K,T,H,Eq> & hm) { hm.CopyTo(this); return *this; } //:Ignore #ifdef DEBUG int _BucketCount(); int _EmptyBuckets(); int _BucketsUsed(); int _FullestBucket(); bool AssertValid() { AssertPtrN(m_prgihsndBuckets); Assert(m_prgihsndBuckets || !m_cBuckets); Assert(!m_prgihsndBuckets || m_cBuckets); AssertArray(m_prgihsndBuckets, m_cBuckets); AssertPtrN(m_prghsnd); Assert(m_prghsnd || !m_ihsndMax); Assert(!m_prghsnd || m_ihsndMax); AssertArray(m_prghsnd, m_ihsndMax); Assert(0 <= m_ihsndLim && m_ihsndLim <= m_ihsndMax); Assert(-1 <= FreeListIdx(m_ihsndFirstFree)); Assert(FreeListIdx(m_ihsndFirstFree) < m_ihsndLim); return true; } #endif //:End Ignore protected: //:> Member variables int * m_prgihsndBuckets; int m_cBuckets; HashNode * m_prghsnd; int m_ihsndLim; int m_ihsndMax; int m_ihsndFirstFree; // stores -(ihsnd + 3) //:> Protected methods //:Ignore /*------------------------------------------------------------------------------------------ Map between real index and "free list" index. Note that this mapping is bidirectional. ------------------------------------------------------------------------------------------*/ int FreeListIdx(int ihsnd) { return -(ihsnd + 3); } //:End Ignore }; // Local Variables: // mode:C++ // c-file-style:"cellar" // tab-width:4 // End: #endif /*HASHMAP_H_INCLUDED*/ --- NEW FILE: UtilInt.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: UtilInt.h Responsibility: Steve McConnel (was Shon Katzenberger) Last reviewed: Integer utilities. ----------------------------------------------------------------------------------------------*/ #pragma once #ifndef UtilInt_H #define UtilInt_H 1 const int knMax = 0x7FFFFFFF; /*********************************************************************************************** Intel 80386 routines. ***********************************************************************************************/ #define MulDiv MulDivImp inline int MulDiv(int n, int nMul, int nDiv) { Assert(nDiv != 0); __asm { mov eax,n imul nMul idiv nDiv mov n,eax } return n; } inline int MulDivMod(int n, int nMul, int nDiv, int *pnRem) { Assert(nDiv != 0); AssertPtr(pnRem); __asm { mov eax,n imul nMul idiv nDiv mov ecx,pnRem mov DWORD PTR[ecx],edx mov n,eax } return n; } /*********************************************************************************************** These arithmetic functions assert that the result doesn't overflow. ***********************************************************************************************/ /*---------------------------------------------------------------------------------------------- Multiply two integers and assert on overflow. ----------------------------------------------------------------------------------------------*/ template<typename T> inline int Mul(T t1, T t2) { Assert(!t1 || (t1 * t2) / t1 == t2); return t1 * t2; } /*---------------------------------------------------------------------------------------------- Add two integers and assert on overflow. ----------------------------------------------------------------------------------------------*/ template<typename T> inline int Add(T t1, T t2) { Assert((t1 + t2 < t2) == (t1 < 0)); return t1 + t2; } /*********************************************************************************************** Arithmetic functions. ***********************************************************************************************/ /*---------------------------------------------------------------------------------------------- Return the floor(tNum / tDen) where floor(x) is defined as the the greatest integer that is less than or equal to the number. This only works for signed integer types. ----------------------------------------------------------------------------------------------*/ template<typename T> inline T FloorDiv(T tNum, T tDen) { Assert(tDen != 0); return tNum / tDen - ((tNum ^ tDen) < 0 && (tNum % tDen)); } /*---------------------------------------------------------------------------------------------- Return the absolute value of the given integer. ----------------------------------------------------------------------------------------------*/ inline uint Abs(int n) { return n < 0 ? -n : n; } /*********************************************************************************************** Hash functions. ***********************************************************************************************/ /* uint ComputeHashRgb(const byte * prgb, int cb, uint uHash = 0); uint CaseSensitiveComputeHash(LPCOLESTR psz, uint uHash = 0); uint CaseSensitiveComputeHashCch(const OLECHAR * prgch, int cch, uint uHash = 0); uint CaseInsensitiveComputeHash(LPCOLESTR psz, uint uHash = 0); uint CaseInsensitiveComputeHashCch(const OLECHAR * prgch, int cch, uint uHash = 0); */ /*********************************************************************************************** Getting primes. ***********************************************************************************************/ // Looks for a prime near u. The primes are gotten from a table in Util.cpp. uint GetPrimeNear(uint u); // Looks for a prime larger than u. If u is larger than the largest prime in the table, we // just return that largest prime. uint GetLargerPrime(uint u); // Looks for a prime smaller than u. If u is smaller than the smallest prime in the table, // we just return that smallest prime. uint GetSmallerPrime(uint u); /*********************************************************************************************** Max and Min. ***********************************************************************************************/ template<typename T> T Max(T t1, T t2) { return (t1 >= t2) ? t1 : t2; } template<typename T> T Min(T t1, T t2) { return (t1 <= t2) ? t1 : t2; } inline int NMax(int n1, int n2) { return (n1 >= n2) ? n1 : n2; } inline int NMin(int n1, int n2) { return (n1 <= n2) ? n1 : n2; } /*---------------------------------------------------------------------------------------------- If t < tMin, this returns tMin. Otherwise if t > tMax, it returns tMax. Otherwise it returns t. ----------------------------------------------------------------------------------------------*/ template<typename T> T Bound(T t, T tMin, T tMax) { return t < tMin ? tMin : t > tMax ? tMax : t; } inline int NBound(int n, int nMin, int nMax) { return n < nMin ? nMin : n > nMax ? nMax : n; } /*---------------------------------------------------------------------------------------------- This returns true iff tMin <= t && t < tLim. ----------------------------------------------------------------------------------------------*/ template<typename T> bool InInterval(T t, T tMin, T tLim) { return tMin <= t && t < tLim; } inline int SignedInt(OLECHAR ch) { if (ch & 0x00008000) { // Negative number. int nRet = (ch | 0xFFFF0000); return nRet; } else return (int)ch; } #endif // !UtilInt_H --- NEW FILE: UtilSet.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: Set.h Responsibility: Steve McConnel Last reviewed: Not yet. Description: This provides a template collection class to replace std::set. Its primary reason to exist is to allow explicit checking for internal memory allocation failures. ----------------------------------------------------------------------------------------------*/ #pragma once #ifndef SET_H_INCLUDED #define SET_H_INCLUDED //:End Ignore /*---------------------------------------------------------------------------------------------- Set template collection class for storing unique objects of an arbitrary class. Hungarian: set[T] ----------------------------------------------------------------------------------------------*/ template<class T, class H = HashObj, class Eq = EqlObj> class Set { public: //:> Internal helper classes. /*------------------------------------------------------------------------------------------ This is the basic data structure for storing a value in a set. In order to handle hash collisions, this structure is a member of a linked list. It should not be used outside the implementation of Set<T, H, Eq> itself. Hungarian: hsnd ------------------------------------------------------------------------------------------*/ class HashNode { public: // Default Constructor. HashNode(void) : m_value(T()), m_nHash(0), m_ihsndNext(0) { } // Constructor. HashNode(T & value, int nHash, int ihsndNext = -1) : m_value(value), m_nHash(nHash), m_ihsndNext(ihsndNext) { } // Destructor. ~HashNode() { } //:> Member variable access. void PutValue(T & value) { m_value = value; } T & GetValue() { return m_value; } void PutHash(int nHash) { m_nHash = nHash; } int GetHash() { return m_nHash; } void PutNext(int ihsndNext) { m_ihsndNext = ihsndNext; } int GetNext() { return m_ihsndNext; } /*-------------------------------------------------------------------------------------- Check whether the given HashNode is being used. --------------------------------------------------------------------------------------*/ bool InUse() { return m_ihsndNext >= -1; } protected: //:> Member variables. T m_value; int m_nHash; int m_ihsndNext; // -1 means end of list, -(ihsnd + 3) for free list members. }; /*------------------------------------------------------------------------------------------ This provides an iterator for stepping through all HashNodes stored in the set. This is useful primarily for saving the contents of a set to a file. Hungarian: itset[T] ------------------------------------------------------------------------------------------*/ class iterator { public: //:> Constructors/destructors/etc. iterator() : m_psetParent(NULL), m_irghsnd(0) { } iterator(Set<T,H,Eq> * pset, int irghsnd) : m_psetParent(pset), m_irghsnd(irghsnd) { } iterator(const iterator & v) : m_psetParent(v.m_psetParent), m_irghsnd(v.m_irghsnd) { } ~iterator() { } //:> Other public methods. iterator & operator = (const iterator & itseto) { m_psetParent = itseto.m_psetParent; m_irghsnd = itseto.m_irghsnd; return *this; } T & operator * (void) { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd < m_psetParent->m_ihsndLim); return m_psetParent->m_prghsnd[m_irghsnd].GetValue(); } HashNode * operator -> (void) { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd < m_psetParent->m_ihsndLim); return &m_psetParent->m_prghsnd[m_irghsnd]; } iterator & operator ++ (void) { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd <= m_psetParent->m_ihsndLim); ++m_irghsnd; // // Make sure that this new HashNode is actually in use. // while (m_irghsnd < m_psetParent->m_ihsndLim) { if (m_psetParent->m_prghsnd[m_irghsnd].InUse()) return *this; // Skip to the next one and check it. ++m_irghsnd; } if (m_irghsnd > m_psetParent->m_ihsndLim) m_irghsnd = m_psetParent->m_ihsndLim; return *this; } bool operator == (const iterator & itseto) { return (m_psetParent == itseto.m_psetParent) && (m_irghsnd == itseto.m_irghsnd); } bool operator != (const iterator & itseto) { return (m_psetParent != itseto.m_psetParent) || (m_irghsnd != itseto.m_irghsnd); } T & GetValue(void) { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd < m_psetParent->m_ihsndLim); Assert(m_psetParent->m_prghsnd[m_irghsnd].InUse()); return m_psetParent->m_prghsnd[m_irghsnd].GetValue(); } int GetHash() { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd < m_psetParent->m_ihsndLim); Assert(m_psetParent->m_prghsnd[m_irghsnd].InUse()); return m_psetParent->m_prghsnd[m_irghsnd].GetHash(); } int GetIndex() { AssertPtr(m_psetParent); AssertObj(m_psetParent); AssertPtr(m_psetParent->m_prghsnd); Assert(0 <= m_irghsnd && m_irghsnd < m_psetParent->m_ihsndLim); Assert(m_psetParent->m_prghsnd[m_irghsnd].InUse()); return m_irghsnd; } protected: // Member variables. Set<T,H,Eq> * m_psetParent; int m_irghsnd; }; friend class iterator; //:> Constructors/destructors/etc. Set(); ~Set(); //:> Other public methods. iterator Begin(); iterator End(); void Insert(T & value, int * pihsndOut = NULL); bool IsMember(T & value); bool Delete(T & value); void Clear(); bool GetIndex(T & value, int * pihsndRet); bool IndexValue(int ihsnd, T * pvalueRet); int Size(); bool Equals(Set<T, H, Eq> & itset); //:Ignore #ifdef DEBUG // For debugging. int _BucketCount(); int _EmptyBuckets(); int _BucketsUsed(); int _FullestBucket(); bool AssertValid() { AssertPtrN(m_prgihsndBuckets); Assert(m_prgihsndBuckets || !m_cBuckets); Assert(!m_prgihsndBuckets || m_cBuckets); AssertArray(m_prgihsndBuckets, m_cBuckets); AssertPtrN(m_prghsnd); Assert(m_prghsnd || !m_ihsndMax); Assert(!m_prghsnd || m_ihsndMax); AssertArray(m_prghsnd, m_ihsndMax); Assert(0 <= m_ihsndLim && m_ihsndLim <= m_ihsndMax); Assert(-1 <= FreeListIdx(m_ihsndFirstFree)); Assert(FreeListIdx(m_ihsndFirstFree) < m_ihsndLim); return true; } #endif //:End Ignore protected: //:> Member variables. int * m_prgihsndBuckets; int m_cBuckets; HashNode * m_prghsnd; int m_ihsndLim; int m_ihsndMax; int m_ihsndFirstFree; //:> Protected methods. /*------------------------------------------------------------------------------------------ Map between real index and "free list" index. Note that this mapping is bidirectional. @param ihsnd ------------------------------------------------------------------------------------------*/ int FreeListIdx(int ihsnd) { return -(ihsnd + 3); } }; // Local Variables: // mode:C++ // c-file-style:"cellar" // tab-width:4 // End: #endif /*SET_H_INCLUDED*/ Index: GrCommon.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrCommon.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrCommon.h 17 Apr 2003 16:31:22 -0000 1.4 +++ GrCommon.h 17 Apr 2003 22:04:01 -0000 1.5 @@ -259,6 +259,7 @@ /************************************************************************************* Utility headers. *************************************************************************************/ +#include "UtilInt.h" #include "UtilRect.h" #include "GenericResource.h" #include "UtilString.h" Index: GrPlatform.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrPlatform.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- GrPlatform.h 1 Apr 2003 08:55:09 -0000 1.1 +++ GrPlatform.h 17 Apr 2003 22:04:01 -0000 1.2 @@ -8,7 +8,6 @@ typedef unsigned short wchar_t; #endif - typedef unsigned char BYTE; #ifndef NULL @@ -34,6 +33,10 @@ { return false; } + + +// This should probably be moved here, if we keep it: +/////typedef wchar_t grwchar; // Can probably remove this stuff: |
From: <sil...@li...> - 2003-04-17 16:31:28
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv1319 Modified Files: GrCommon.h Log Message: redefine grwchar to unsigned short so it is the same on windows and linux also only ues the pragmas and tchar.h for windows Index: GrCommon.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrCommon.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrCommon.h 16 Apr 2003 19:59:37 -0000 1.3 +++ GrCommon.h 17 Apr 2003 16:31:22 -0000 1.4 @@ -63,8 +63,9 @@ //#include <time.h> //#include <math.h> #include <limits.h> +#ifndef __GNUC__ #include <tchar.h> - +#endif //#include <crtdbg.h> //#include <exception> @@ -97,6 +98,7 @@ /*********************************************************************************************** Turn off the goofy warnings. ***********************************************************************************************/ +#ifdef _MSC_VER #pragma warning(disable: 4065) // Switch statement contains default but no case. #pragma warning(disable: 4097) // typedef-name 'xxx' used as synonym for class-name 'yyy'. #pragma warning(disable: 4100) // unreferenced formal parameter. @@ -121,7 +123,7 @@ #pragma warning(disable: 4710) // not inlined. #pragma warning(disable: 4786) // identifier truncated in debug info. #pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning). - +#endif /*********************************************************************************************** Simple types. @@ -136,6 +138,7 @@ typedef unsigned short UOLECHAR; typedef __int64 int64; // Hungarian: lln typedef unsigned __int64 uint64; // Hungarian llu +typedef unsigned short grwchar; // TODO ShonK: Make generic use these where appropriate. @@ -148,7 +151,6 @@ typedef achar * Psz; typedef const achar * Pcsz; -typedef wchar grwchar; /************************************************************************************* @@ -160,9 +162,9 @@ #define offsetof(cls,fld) ((int)&((cls *)0)->fld) #endif +#ifndef NO_ASM #define addrsafe_offsetof(cls,fld) reinterpret_cast<int>(AddrOf(((cls *)0)->fld)) -#ifndef NO_ASM template<typename T> inline T * AddrOf(T & x) { T * pt; |
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv3270/src/GrEngine Modified Files: FileInput.cpp FileInput.h GrCharStream.cpp GrCharStream.h GrClassTable.cpp GrClassTable.h GrEngine.cpp GrFSM.cpp GrFSM.h GrGlyphTable.cpp GrGlyphTable.h GrPass.cpp GrPass.h GrPassActionCode.cpp GrPseudoMap.h GrSegment.cpp GrSlotState.cpp GrSlotState.h GrSlotStream.cpp GrSlotStream.h GrTableManager.cpp GrTableManager.h TestFSM.cpp TestPasses.cpp TransductionLog.cpp main.h Log Message: Synchronized with FW, 16 Apr 2003, changelist #6720 Index: FileInput.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/FileInput.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- FileInput.cpp 5 Nov 2002 21:29:14 -0000 1.1.1.1 +++ FileInput.cpp 16 Apr 2003 19:59:39 -0000 1.2 @@ -122,7 +122,7 @@ short GrFileIStream::ReadShortFromFont() { #ifdef comFileIO - wchar chwInput; + grwchar chwInput; ULONG cbRead; HRESULT hr = m_qstrm->Read(&chwInput, 2, &cbRead); if (FAILED(hr)) @@ -133,7 +133,7 @@ return snInput; #else // TODO: test for reading beyond the end of the file. - wchar chwInput; + grwchar chwInput; read((char *)&chwInput, isizeof(short)); short snInput = lsbf(chwInput); return snInput; @@ -144,10 +144,10 @@ Read a wide character (unsigned 16-bit word) from the stream. Switch the bytes from big-endian to little-endian format. ----------------------------------------------------------------------------------------------*/ -wchar GrFileIStream::ReadUShortFromFont() +grwchar GrFileIStream::ReadUShortFromFont() { #ifdef comFileIO - wchar chwInput; + grwchar chwInput; ULONG cbRead; HRESULT hr = m_qstrm->Read(&chwInput, 2, &cbRead); if (FAILED(hr)) @@ -158,7 +158,7 @@ return chwInput; #else // TODO: test for reading beyond the end of the file. - wchar chwInput; + grwchar chwInput; read((char *)&chwInput, isizeof(short)); chwInput = lsbf(chwInput); return chwInput; @@ -334,10 +334,10 @@ Read a wide character (unsigned 16-bit word) from the stream. Switch the bytes from big-endian to little-endian format. ----------------------------------------------------------------------------------------------*/ -wchar GrBufferIStream::ReadUShortFromFont() +grwchar GrBufferIStream::ReadUShortFromFont() { - wchar chwInput = *(wchar *)pbNext; - pbNext += isizeof(wchar); + grwchar chwInput = *(grwchar *)pbNext; + pbNext += isizeof(grwchar); Assert(pbNext <= pbLim); chwInput = lsbf(chwInput); return chwInput; @@ -402,12 +402,12 @@ return nRet; } -wchar swapb(wchar chwArg) +grwchar swapb(grwchar chwArg) { - wchar b1, b2; + grwchar b1, b2; b1 = ((chwArg & 0xFF00) >> 8) & 0x00FF; // remove sign extension b2 = ((chwArg & 0x00FF) << 8); // & 0xFF00; - wchar chwRet = b1 | b2; + grwchar chwRet = b1 | b2; return chwRet; } Index: FileInput.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/FileInput.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- FileInput.h 14 Apr 2003 21:34:27 -0000 1.4 +++ FileInput.h 16 Apr 2003 19:59:39 -0000 1.5 @@ -21,17 +21,17 @@ //:End Ignore int swapb(int nArg); -wchar swapb(wchar chwArg); +grwchar swapb(grwchar chwArg); short swapb(short snArg); // Most significant byte first (converting from least-sig-first): inline int msbf(int nArg) { return swapb(nArg); } -inline wchar msbf(wchar chwArg) { return swapb(chwArg); } +inline grwchar msbf(grwchar chwArg) { return swapb(chwArg); } inline short msbf(short chwArg) { return swapb(chwArg); } // Least significant byte first (converting from most-sig first): inline int lsbf(int nArg) { return swapb(nArg); } -inline wchar lsbf(wchar chwArg) { return swapb(chwArg); } +inline grwchar lsbf(grwchar chwArg) { return swapb(chwArg); } inline short lsbf(short chwArg) { return swapb(chwArg); } class GrIStream @@ -41,12 +41,15 @@ virtual byte ReadByteFromFont() = 0; virtual short ReadShortFromFont() = 0; - virtual wchar ReadUShortFromFont() = 0; + virtual grwchar ReadUShortFromFont() = 0; virtual int ReadIntFromFont() = 0; virtual void ReadBlockFromFont(void * pvInput, int cb) = 0; virtual void GetPositionInFont(long * plPos) = 0; virtual void SetPositionInFont(long lPos) = 0; + + virtual bool OpenBuffer(byte * pbBuffer, int cb) = 0; + virtual void CloseBuffer() = 0; }; @@ -75,7 +78,7 @@ virtual byte ReadByteFromFont(); virtual short ReadShortFromFont(); - virtual wchar ReadUShortFromFont(); + virtual grwchar ReadUShortFromFont(); virtual int ReadIntFromFont(); virtual void ReadBlockFromFont(void * pvInput, int cb); @@ -86,8 +89,16 @@ // outside of FW, it is just a bogus, trivial class that is not used { -#endif // GR_FW +#endif // !GR_FW + // Do-nothing methods: + virtual bool OpenBuffer(byte * pbBuffer, int cb) + { + return true; + } + virtual void CloseBuffer() + { + } }; @@ -105,14 +116,18 @@ virtual byte ReadByteFromFont(); virtual short ReadShortFromFont(); - virtual wchar ReadUShortFromFont(); + virtual grwchar ReadUShortFromFont(); virtual int ReadIntFromFont(); virtual void ReadBlockFromFont(void * pvInput, int cb); virtual void GetPositionInFont(long * plPos); virtual void SetPositionInFont(long lPos); - bool OpenBuffer(byte * pbBuffer, int cb); + virtual bool OpenBuffer(byte * pbBuffer, int cb); + virtual void CloseBuffer() + { + Close(); + } protected: byte * pbStart; Index: GrCharStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrCharStream.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrCharStream.cpp 14 Apr 2003 21:34:28 -0000 1.4 +++ GrCharStream.cpp 16 Apr 2003 19:59:40 -0000 1.5 @@ -100,7 +100,7 @@ m_prgnRunText = NewObj int[m_cnRunMax]; } - wchar * prgchwRunText = NewObj wchar[m_ichwRunLim - m_ichwRunMin]; + grwchar * prgchwRunText = NewObj grwchar[m_ichwRunLim - m_ichwRunMin]; res = m_pgts->Fetch(m_ichwRunMin, m_ichwRunLim, prgchwRunText); if (ResultFailed(res)) { @@ -175,7 +175,7 @@ Convert UTF-16 to UTF-32--a single character's worth. Return the number of 16-bit items consumed. ----------------------------------------------------------------------------------------------*/ -int GrCharStream::Utf16ToUtf32(wchar * prgchw, int cchw, int * pcchwUsed) +int GrCharStream::Utf16ToUtf32(grwchar * prgchw, int cchw, int * pcchwUsed) { if (cchw <= 0) { @@ -234,7 +234,7 @@ THROW(res); return true; } - wchar * prgchwRunText = NewObj wchar[ichwRunLim - ichwRunMin]; + grwchar * prgchwRunText = NewObj grwchar[ichwRunLim - ichwRunMin]; res = pgts->Fetch(ichwRunMin, ichwRunLim, prgchwRunText); if (ResultFailed(res)) { @@ -252,7 +252,7 @@ Return true if the given position is at the boundary of a Unicode character; return false if it is between two parts of pair of surrogates. ----------------------------------------------------------------------------------------------*/ -bool GrCharStream::AtUnicodeCharBoundary(wchar * prgchw, int cchw, int ichw) +bool GrCharStream::AtUnicodeCharBoundary(grwchar * prgchw, int cchw, int ichw) { Assert(ichw >= 0); Assert(ichw <= cchw); @@ -292,7 +292,7 @@ true if they are a legitimate surrogate pair. If not, just return the first of the two 16-bit characters. ----------------------------------------------------------------------------------------------*/ -bool GrCharStream::FromSurrogatePair(wchar chIn1, wchar chIn2, uint * pch32Out) +bool GrCharStream::FromSurrogatePair(grwchar chIn1, grwchar chIn2, uint * pch32Out) { if ((chIn1 < 0xD800) || (chIn1 > 0xDBFF) || (chIn2 < 0xDC00) || (chIn2 > 0xDFFF)) { @@ -414,8 +414,8 @@ { Assert(fSettingDefaults == (pgreng != NULL)); - wchar * pchw = const_cast<wchar *>(stu.Chars()); - wchar * pchwLim = pchw + stu.Length(); + grwchar * pchw = const_cast<grwchar *>(stu.Chars()); + grwchar * pchwLim = pchw + stu.Length(); while (pchw < pchwLim) { int nID = 0; Index: GrCharStream.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrCharStream.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrCharStream.h 12 Feb 2003 15:35:54 -0000 1.5 +++ GrCharStream.h 16 Apr 2003 19:59:41 -0000 1.6 @@ -82,7 +82,7 @@ GrFeatureValues * rgfval, COLORREF * rgclrFore, COLORREF * rgclrBack, int cchwBackup, int * pcchwMax16bit); void GetLogDataSurrogates(GrTableManager * ptman, int cchw, int cchwBackup, - int cchwMax16bit, int * prgnChars, wchar * prgchw2, int * prgichw16bit); + int cchwMax16bit, int * prgnChars, grwchar * prgchw2, int * prgichw16bit); protected: void SetUpFeatureValues(GrTableManager * ptman, int ichw); @@ -90,10 +90,10 @@ static void ParseFeatureString(GrEngine *, GrTableManager *, GrCharStream *, StrUni stu, bool fSettingDefaults); - static int Utf16ToUtf32(wchar * prgchw16bit, int cchw, int * pcchwUsed); + static int Utf16ToUtf32(grwchar * prgchw16bit, int cchw, int * pcchwUsed); static bool AtUnicodeCharBoundary(IGrTextSource * pgts, int ichw); - static bool AtUnicodeCharBoundary(wchar * prgch, int cchw, int ichw); - static bool FromSurrogatePair(wchar chIn1, wchar chIn2, uint * pch32Out); + static bool AtUnicodeCharBoundary(grwchar * prgch, int cchw, int ichw); + static bool FromSurrogatePair(grwchar chIn1, grwchar chIn2, uint * pch32Out); protected: // Instance variables: Index: GrClassTable.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrClassTable.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrClassTable.cpp 14 Apr 2003 21:34:28 -0000 1.3 +++ GrClassTable.cpp 16 Apr 2003 19:59:42 -0000 1.4 @@ -49,10 +49,10 @@ m_cclsLinear = grstrm.ReadUShortFromFont(); // class offsets - m_prgichwOffsets = NewObj wchar[m_ccls + 1]; + m_prgichwOffsets = NewObj grwchar[m_ccls + 1]; Assert(m_prgichwOffsets); - wchar * pchw = m_prgichwOffsets; + grwchar * pchw = m_prgichwOffsets; int icls; for (icls = 0; icls <= m_ccls; icls++, pchw++) { @@ -60,7 +60,7 @@ } // Offsets are relative to the start class map; make them relative to the class list - // itself, and in terms of wchars, not bytes. + // itself, and in terms of grwchars, not bytes. long lClassesPos; grstrm.GetPositionInFont(&lClassesPos); int cbDiff = lClassesPos - lClassMapStart; @@ -72,10 +72,10 @@ } // classes - slurp entire block (data remains in big-endian format) - m_prgchwBIGGlyphList = NewObj wchar[m_prgichwOffsets[m_ccls]]; + m_prgchwBIGGlyphList = NewObj grwchar[m_prgichwOffsets[m_ccls]]; Assert(m_prgchwBIGGlyphList); grstrm.ReadBlockFromFont(m_prgchwBIGGlyphList, - m_prgichwOffsets[m_ccls] * isizeof(wchar)); + m_prgichwOffsets[m_ccls] * isizeof(grwchar)); } /*---------------------------------------------------------------------------------------------- @@ -92,7 +92,7 @@ /*---------------------------------------------------------------------------------------------- Search for the glyph ID using a fast binary search, and return the matching index. ----------------------------------------------------------------------------------------------*/ -int GrInputClass::FindIndex(wchar gid) +int GrInputClass::FindIndex(grwchar gid) { int cgix = NumberOfGlyphs(); int digixInit = InitialSearchRange(); @@ -135,7 +135,7 @@ /*---------------------------------------------------------------------------------------------- Return the selector index for the given glyph ID. ----------------------------------------------------------------------------------------------*/ -int GrClassTable::FindIndex(int icls, wchar chwGlyphID) +int GrClassTable::FindIndex(int icls, grwchar chwGlyphID) { if (icls < m_cclsLinear) { @@ -170,7 +170,7 @@ /*---------------------------------------------------------------------------------------------- Return the glyph ID at the selector index. ----------------------------------------------------------------------------------------------*/ -wchar GrClassTable::GetGlyphID(int icls, int ichw) +grwchar GrClassTable::GetGlyphID(int icls, int ichw) { if (ichw < 0) { @@ -226,96 +226,96 @@ m_ccls = 7; // number of classes m_cclsLinear = 4; // number of classes in linear format - m_prgchwBIGGlyphList = NewObj wchar[100]; + m_prgchwBIGGlyphList = NewObj grwchar[100]; - m_prgichwOffsets = NewObj wchar[7+1]; + m_prgichwOffsets = NewObj grwchar[7+1]; - wchar * pchw = m_prgchwBIGGlyphList; + grwchar * pchw = m_prgchwBIGGlyphList; // Output class 0: uppercase consonants B - H m_prgichwOffsets[0] = 0; - *pchw++ = msbf(wchar(66)); *pchw++ = msbf(wchar(67)); *pchw++ = msbf(wchar(68)); - *pchw++ = msbf(wchar(70)); *pchw++ = msbf(wchar(71)); *pchw++ = msbf(wchar(72)); + *pchw++ = msbf(grwchar(66)); *pchw++ = msbf(grwchar(67)); *pchw++ = msbf(grwchar(68)); + *pchw++ = msbf(grwchar(70)); *pchw++ = msbf(grwchar(71)); *pchw++ = msbf(grwchar(72)); // Output class 1: grave vowels m_prgichwOffsets[1] = 6; - *pchw++ = msbf(wchar(192)); // A - *pchw++ = msbf(wchar(224)); // a - *pchw++ = msbf(wchar(200)); // E - *pchw++ = msbf(wchar(232)); // e - *pchw++ = msbf(wchar(204)); // I - *pchw++ = msbf(wchar(236)); // i - *pchw++ = msbf(wchar(210)); // O - *pchw++ = msbf(wchar(243)); // o - *pchw++ = msbf(wchar(217)); // U - *pchw++ = msbf(wchar(249)); // u + *pchw++ = msbf(grwchar(192)); // A + *pchw++ = msbf(grwchar(224)); // a + *pchw++ = msbf(grwchar(200)); // E + *pchw++ = msbf(grwchar(232)); // e + *pchw++ = msbf(grwchar(204)); // I + *pchw++ = msbf(grwchar(236)); // i + *pchw++ = msbf(grwchar(210)); // O + *pchw++ = msbf(grwchar(243)); // o + *pchw++ = msbf(grwchar(217)); // U + *pchw++ = msbf(grwchar(249)); // u // Output class 2: circumflex vowels m_prgichwOffsets[2] = 6 + 10; - *pchw++ = msbf(wchar(194)); // A - *pchw++ = msbf(wchar(226)); // a - *pchw++ = msbf(wchar(202)); // E - *pchw++ = msbf(wchar(234)); // e - *pchw++ = msbf(wchar(206)); // I - *pchw++ = msbf(wchar(238)); // i - *pchw++ = msbf(wchar(212)); // O - *pchw++ = msbf(wchar(244)); // o - *pchw++ = msbf(wchar(219)); // U - *pchw++ = msbf(wchar(251)); // u + *pchw++ = msbf(grwchar(194)); // A + *pchw++ = msbf(grwchar(226)); // a + *pchw++ = msbf(grwchar(202)); // E + *pchw++ = msbf(grwchar(234)); // e + *pchw++ = msbf(grwchar(206)); // I + *pchw++ = msbf(grwchar(238)); // i + *pchw++ = msbf(grwchar(212)); // O + *pchw++ = msbf(grwchar(244)); // o + *pchw++ = msbf(grwchar(219)); // U + *pchw++ = msbf(grwchar(251)); // u // Output class 3: diaeresis vowels, uppercase m_prgichwOffsets[3] = 16 + 10; - *pchw++ = msbf(wchar(196)); // A - *pchw++ = msbf(wchar(196)); // A - *pchw++ = msbf(wchar(203)); // E - *pchw++ = msbf(wchar(203)); // E - *pchw++ = msbf(wchar(207)); // I - *pchw++ = msbf(wchar(207)); // I - *pchw++ = msbf(wchar(214)); // O - *pchw++ = msbf(wchar(214)); // O - *pchw++ = msbf(wchar(220)); // U - *pchw++ = msbf(wchar(220)); // U + *pchw++ = msbf(grwchar(196)); // A + *pchw++ = msbf(grwchar(196)); // A + *pchw++ = msbf(grwchar(203)); // E + *pchw++ = msbf(grwchar(203)); // E + *pchw++ = msbf(grwchar(207)); // I + *pchw++ = msbf(grwchar(207)); // I + *pchw++ = msbf(grwchar(214)); // O + *pchw++ = msbf(grwchar(214)); // O + *pchw++ = msbf(grwchar(220)); // U + *pchw++ = msbf(grwchar(220)); // U // Input class 4: lowercase consonants b - h m_prgichwOffsets[4] = 26 + 10; // = 36 - *pchw++ = msbf(wchar(6)); - *pchw++ = msbf(wchar(4)); *pchw++ = msbf(wchar(2)); *pchw++ = msbf(wchar(6-4)); - *pchw++ = msbf(wchar(98)); *pchw++ = msbf(wchar(0)); - *pchw++ = msbf(wchar(99)); *pchw++ = msbf(wchar(1)); - *pchw++ = msbf(wchar(100)); *pchw++ = msbf(wchar(2)); - *pchw++ = msbf(wchar(102)); *pchw++ = msbf(wchar(3)); - *pchw++ = msbf(wchar(103)); *pchw++ = msbf(wchar(4)); - *pchw++ = msbf(wchar(104)); *pchw++ = msbf(wchar(5)); + *pchw++ = msbf(grwchar(6)); + *pchw++ = msbf(grwchar(4)); *pchw++ = msbf(grwchar(2)); *pchw++ = msbf(grwchar(6-4)); + *pchw++ = msbf(grwchar(98)); *pchw++ = msbf(grwchar(0)); + *pchw++ = msbf(grwchar(99)); *pchw++ = msbf(grwchar(1)); + *pchw++ = msbf(grwchar(100)); *pchw++ = msbf(grwchar(2)); + *pchw++ = msbf(grwchar(102)); *pchw++ = msbf(grwchar(3)); + *pchw++ = msbf(grwchar(103)); *pchw++ = msbf(grwchar(4)); + *pchw++ = msbf(grwchar(104)); *pchw++ = msbf(grwchar(5)); // Input class 5: vowels m_prgichwOffsets[5] = 36 + 4 + 6*2; // = 52 - *pchw++ = msbf(wchar(10)); - *pchw++ = msbf(wchar(8)); *pchw++ = msbf(wchar(3)); *pchw++ = msbf(wchar(10-8)); - *pchw++ = msbf(wchar(65)); *pchw++ = msbf(wchar(0)); // A - *pchw++ = msbf(wchar(69)); *pchw++ = msbf(wchar(2)); // E - *pchw++ = msbf(wchar(73)); *pchw++ = msbf(wchar(4)); // I - *pchw++ = msbf(wchar(79)); *pchw++ = msbf(wchar(6)); // O - *pchw++ = msbf(wchar(85)); *pchw++ = msbf(wchar(8)); // U - *pchw++ = msbf(wchar(97)); *pchw++ = msbf(wchar(1)); // a - *pchw++ = msbf(wchar(101)); *pchw++ = msbf(wchar(3)); // e - *pchw++ = msbf(wchar(105)); *pchw++ = msbf(wchar(5)); // i - *pchw++ = msbf(wchar(111)); *pchw++ = msbf(wchar(7)); // o - *pchw++ = msbf(wchar(117)); *pchw++ = msbf(wchar(9)); // u + *pchw++ = msbf(grwchar(10)); + *pchw++ = msbf(grwchar(8)); *pchw++ = msbf(grwchar(3)); *pchw++ = msbf(grwchar(10-8)); + *pchw++ = msbf(grwchar(65)); *pchw++ = msbf(grwchar(0)); // A + *pchw++ = msbf(grwchar(69)); *pchw++ = msbf(grwchar(2)); // E + *pchw++ = msbf(grwchar(73)); *pchw++ = msbf(grwchar(4)); // I + *pchw++ = msbf(grwchar(79)); *pchw++ = msbf(grwchar(6)); // O + *pchw++ = msbf(grwchar(85)); *pchw++ = msbf(grwchar(8)); // U + *pchw++ = msbf(grwchar(97)); *pchw++ = msbf(grwchar(1)); // a + *pchw++ = msbf(grwchar(101)); *pchw++ = msbf(grwchar(3)); // e + *pchw++ = msbf(grwchar(105)); *pchw++ = msbf(grwchar(5)); // i + *pchw++ = msbf(grwchar(111)); *pchw++ = msbf(grwchar(7)); // o + *pchw++ = msbf(grwchar(117)); *pchw++ = msbf(grwchar(9)); // u // Input class 6: acute vowels m_prgichwOffsets[6] = 52 + 4 + 10*2; // = 76 - *pchw++ = msbf(wchar(10)); - *pchw++ = msbf(wchar(8)); *pchw++ = msbf(wchar(3)); *pchw++ = msbf(wchar(10-8)); - *pchw++ = msbf(wchar(193)); *pchw++ = msbf(wchar(0)); // A - *pchw++ = msbf(wchar(201)); *pchw++ = msbf(wchar(2)); // E - *pchw++ = msbf(wchar(205)); *pchw++ = msbf(wchar(4)); // I - *pchw++ = msbf(wchar(211)); *pchw++ = msbf(wchar(6)); // O - *pchw++ = msbf(wchar(218)); *pchw++ = msbf(wchar(8)); // U - *pchw++ = msbf(wchar(225)); *pchw++ = msbf(wchar(1)); // a - *pchw++ = msbf(wchar(233)); *pchw++ = msbf(wchar(3)); // e - *pchw++ = msbf(wchar(237)); *pchw++ = msbf(wchar(5)); // i - *pchw++ = msbf(wchar(243)); *pchw++ = msbf(wchar(7)); // o - *pchw++ = msbf(wchar(250)); *pchw++ = msbf(wchar(9)); // u + *pchw++ = msbf(grwchar(10)); + *pchw++ = msbf(grwchar(8)); *pchw++ = msbf(grwchar(3)); *pchw++ = msbf(grwchar(10-8)); + *pchw++ = msbf(grwchar(193)); *pchw++ = msbf(grwchar(0)); // A + *pchw++ = msbf(grwchar(201)); *pchw++ = msbf(grwchar(2)); // E + *pchw++ = msbf(grwchar(205)); *pchw++ = msbf(grwchar(4)); // I + *pchw++ = msbf(grwchar(211)); *pchw++ = msbf(grwchar(6)); // O + *pchw++ = msbf(grwchar(218)); *pchw++ = msbf(grwchar(8)); // U + *pchw++ = msbf(grwchar(225)); *pchw++ = msbf(grwchar(1)); // a + *pchw++ = msbf(grwchar(233)); *pchw++ = msbf(grwchar(3)); // e + *pchw++ = msbf(grwchar(237)); *pchw++ = msbf(grwchar(5)); // i + *pchw++ = msbf(grwchar(243)); *pchw++ = msbf(grwchar(7)); // o + *pchw++ = msbf(grwchar(250)); *pchw++ = msbf(grwchar(9)); // u m_prgichwOffsets[7] = 76 + 4 + 10*2; // = 100 }; Index: GrClassTable.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrClassTable.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrClassTable.h 14 Apr 2003 21:34:28 -0000 1.4 +++ GrClassTable.h 16 Apr 2003 19:59:42 -0000 1.5 @@ -30,11 +30,11 @@ friend class GrInputClass; friend class GrClassTable; - wchar GlyphID() { return lsbf(m_gidBIG); } - wchar Index() { return lsbf(m_nBIGIndex); } + grwchar GlyphID() { return lsbf(m_gidBIG); } + grwchar Index() { return lsbf(m_nBIGIndex); } - wchar m_gidBIG; - wchar m_nBIGIndex; + grwchar m_gidBIG; + grwchar m_nBIGIndex; }; /*---------------------------------------------------------------------------------------------- @@ -51,9 +51,9 @@ /*------------------------------------------------------------------------------------------ Copy the raw memory into the instance. ------------------------------------------------------------------------------------------*/ - void CopyFrom(wchar * pchwStart, int cchw) + void CopyFrom(grwchar * pchwStart, int cchw) { - memcpy(this, pchwStart, 4 * isizeof(wchar)); + memcpy(this, pchwStart, 4 * isizeof(grwchar)); int cgix = NumberOfGlyphs(); m_pgixFirst = m_prggixBuffer; if (cgix > 64) @@ -73,18 +73,18 @@ int InitialSearchRange() { return lsbf(m_digixBIGInit); } int StartSearch() { return lsbf(m_igixBIGStart); } - int FindIndex(wchar gid); + int FindIndex(grwchar gid); protected: // Instance variables: - wchar m_cgixBIG; // number of glyphs in the class + grwchar m_cgixBIG; // number of glyphs in the class // constants for fast binary search - wchar m_digixBIGInit; // (max power of 2 <= m_cgix); + grwchar m_digixBIGInit; // (max power of 2 <= m_cgix); // size of initial range to consider - wchar m_cBIGLoop; // log2(max power of 2 <= m_cgix); + grwchar m_cBIGLoop; // log2(max power of 2 <= m_cgix); // indicates how many iterations are necessary - wchar m_igixBIGStart; // m_cgix - m_digixInit; + grwchar m_igixBIGStart; // m_cgix - m_digixInit; // where to start search GrGlyphIndexPair m_prggixBuffer[64]; @@ -124,14 +124,14 @@ void ReadFromFont(GrIStream & grstrm, int nVersion); void CreateEmpty(); - int FindIndex(int icls, wchar chwGlyphID); - wchar GetGlyphID(int icls, int ichw); + int FindIndex(int icls, grwchar chwGlyphID); + grwchar GetGlyphID(int icls, int ichw); - wchar GlyphAt(int ichw) + grwchar GlyphAt(int ichw) { return lsbf(m_prgchwBIGGlyphList[ichw]); } - wchar * GlyphListLoc(int ichw) + grwchar * GlyphListLoc(int ichw) { return m_prgchwBIGGlyphList + ichw; } @@ -141,7 +141,7 @@ int m_ccls; // number of classes int m_cclsLinear; // number of classes in linear format - wchar * m_prgichwOffsets; + grwchar * m_prgichwOffsets; // Two formats are included in the following array: the first section consists of // flat ordered lists of glyphs, used for the "output" classes that use linear format. @@ -153,7 +153,7 @@ // we're interested in it. // NOTE that all this data has been slurped directly from the ECF file and therefore // uses BIG-ENDIAN format. - wchar * m_prgchwBIGGlyphList; + grwchar * m_prgchwBIGGlyphList; //:Ignore #ifdef OLD_TEST_STUFF Index: GrEngine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngine.cpp,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- GrEngine.cpp 14 Apr 2003 22:52:00 -0000 1.8 +++ GrEngine.cpp 16 Apr 2003 19:59:43 -0000 1.9 @@ -135,12 +135,12 @@ { ChkGrArrayArg(prgb, cb); - if (cb % isizeof(wchar)) + if (cb % isizeof(grwchar)) WARN(kresInvalidArg); DestroyContents(); - m_stuInitialize.Assign((const wchar *)prgb, cb / isizeof(wchar)); + m_stuInitialize.Assign((const grwchar *)prgb, cb / isizeof(grwchar)); m_strCtrlFileReg.Clear(); m_strCtrlFileBold.Clear(); @@ -1206,10 +1206,10 @@ if (vbName[lnNameOff + 1] == (unsigned char)0xF0) // 1 - Unicode id is big endian ReturnResult(kresFail); } - if (!TtfUtil::SwapWString(vbName.Begin() + lnNameOff, lnNameSz / isizeof(wchar))) + if (!TtfUtil::SwapWString(vbName.Begin() + lnNameOff, lnNameSz / isizeof(grwchar))) ReturnResult(kresFail); - m_stuFaceName = StrUni((wchar *)(vbName.Begin() + lnNameOff), lnNameSz / isizeof(wchar)); + m_stuFaceName = StrUni((grwchar *)(vbName.Begin() + lnNameOff), lnNameSz / isizeof(grwchar)); */ // head - need units per em @@ -1505,10 +1505,10 @@ if (vbName[lnNameOff + 1] == (unsigned char)0xF0) // 1 - Unicode id is big endian ReturnResult(kresFail); } - if (!TtfUtil::SwapWString(vbName.Begin() + lnNameOff, lnNameSz / isizeof(wchar))) + if (!TtfUtil::SwapWString(vbName.Begin() + lnNameOff, lnNameSz / isizeof(grwchar))) ReturnResult(kresFail); - m_stuFaceName = StrUni((wchar *)(vbName.Begin() + lnNameOff), lnNameSz / isizeof(wchar)); + m_stuFaceName = StrUni((grwchar *)(vbName.Begin() + lnNameOff), lnNameSz / isizeof(grwchar)); */ // Silf @@ -1634,37 +1634,43 @@ { int nCurrentVersion = CurrentTableVersion(); - GrFileIStream * pgrfstrm = dynamic_cast<GrFileIStream *>(pgrstrm); - GrBufferIStream * pgrbstrm = dynamic_cast<GrBufferIStream *>(pgrstrm); - Assert(pgrfstrm || pgrbstrm); +// GrFileIStream * pgrfstrm = dynamic_cast<GrFileIStream *>(pgrstrm); +// GrBufferIStream * pgrbstrm = dynamic_cast<GrBufferIStream *>(pgrstrm); +// Assert(pgrfstrm || pgrbstrm); - if (pgrbstrm) - pgrbstrm->OpenBuffer(vbSilfTbl.Begin(), isizeof(int)); // just reading one int +// if (pgrbstrm) +// pgrbstrm->OpenBuffer(vbSilfTbl.Begin(), isizeof(int)); // just reading one int + pgrstrm->OpenBuffer(vbSilfTbl.Begin(), isizeof(int)); pgrstrm->SetPositionInFont(lSilfStart); *pnVersion = ReadVersion(*pgrstrm); - if (pgrbstrm) - pgrbstrm->Close(); +// if (pgrbstrm) +// pgrbstrm->Close(); + pgrstrm->CloseBuffer(); if (*pnVersion > nCurrentVersion) return false; - if (pgrbstrm) - pgrbstrm->OpenBuffer(vbGlatTbl.Begin(), isizeof(int)); +// if (pgrbstrm) +// pgrbstrm->OpenBuffer(vbGlatTbl.Begin(), isizeof(int)); + pgrstrm->OpenBuffer(vbGlatTbl.Begin(), isizeof(int)); pgrstrm->SetPositionInFont(lGlocStart); *pnVersion = ReadVersion(*pgrstrm); - if (pgrbstrm) - pgrbstrm->Close(); +// if (pgrbstrm) +// pgrbstrm->Close(); + pgrstrm->CloseBuffer(); if (*pnVersion > nCurrentVersion) { Assert(false); // should match Silf table return false; } - if (pgrbstrm) - pgrbstrm->OpenBuffer(vbFeatTbl.Begin(), isizeof(int)); +// if (pgrbstrm) +// pgrbstrm->OpenBuffer(vbFeatTbl.Begin(), isizeof(int)); + pgrstrm->OpenBuffer(vbFeatTbl.Begin(), isizeof(int)); pgrstrm->SetPositionInFont(lFeatStart); *pnVersion = ReadVersion(*pgrstrm); - if (pgrbstrm) - pgrbstrm->Close(); +// if (pgrbstrm) +// pgrbstrm->Close(); + pgrstrm->CloseBuffer(); if (*pnVersion > nCurrentVersion) { Assert(false); // should match Silf table @@ -1675,6 +1681,17 @@ } /*---------------------------------------------------------------------------------------------- + Reinterpret the version number from a font table. +----------------------------------------------------------------------------------------------*/ +int GrEngine::ReadVersion(GrIStream & grstrm) +{ + int nVersion = grstrm.ReadIntFromFont(); + if (nVersion == 0x00010000) + nVersion = 0x00000001; // kludge for silly mistake + return nVersion; +} + +/*---------------------------------------------------------------------------------------------- Initialize the engine from the test file. Used for test procedures. ----------------------------------------------------------------------------------------------*/ //:Ignore @@ -1848,7 +1865,7 @@ grstrm.GetPositionInFont(&lSubTableStart); // maximum glyph ID - wchar chwTmp; + grwchar chwTmp; chwTmp = grstrm.ReadUShortFromFont(); *pchwMaxGlyphID = chwTmp; @@ -1902,7 +1919,7 @@ // rendering behaviors--ignore for now byte cBehaviors = grstrm.ReadByteFromFont(); - wchar chwBehaviors[kMaxRenderingBehavior]; + grwchar chwBehaviors[kMaxRenderingBehavior]; for (i = 0; i < cBehaviors; i++) { chwBehaviors[i] = grstrm.ReadUShortFromFont(); @@ -1936,7 +1953,7 @@ { if (nVersion <= 1) { - wchar chwUnicode = grstrm.ReadUShortFromFont(); + grwchar chwUnicode = grstrm.ReadUShortFromFont(); m_prgpsd[i].SetUnicode(chwUnicode); } else @@ -1944,7 +1961,7 @@ int nUnicode = grstrm.ReadIntFromFont(); m_prgpsd[i].SetUnicode(nUnicode); } - wchar chwPseudo = grstrm.ReadUShortFromFont(); + grwchar chwPseudo = grstrm.ReadUShortFromFont(); m_prgpsd[i].SetPseudoGlyph(chwPseudo); } @@ -2045,7 +2062,7 @@ void GrEngine::ReadFeatTable(GrIStream & grstrm, long lTableStart) { short snTmp; - wchar chwTmp; + grwchar chwTmp; int nTmp; grstrm.SetPositionInFont(lTableStart); @@ -2076,7 +2093,7 @@ nID = chwTmp; vnIDs.Push(nID); // number of settings - wchar cfset = grstrm.ReadUShortFromFont(); + grwchar cfset = grstrm.ReadUShortFromFont(); vcfset.Push(cfset); // offset to settings list nTmp = grstrm.ReadIntFromFont(); @@ -2142,14 +2159,14 @@ bool fLineBreakSave = m_fLineBreak; int cchwPreXlbContextSave = m_cchwPreXlbContext; int cchwPostXlbContextSave = m_cchwPostXlbContext; - wchar chwPseudoAttrSave = m_chwPseudoAttr; - wchar chwBWAttrSave = m_chwBWAttr; - wchar chwDirAttrSave = m_chwDirAttr; + grwchar chwPseudoAttrSave = m_chwPseudoAttr; + grwchar chwBWAttrSave = m_chwBWAttr; + grwchar chwDirAttrSave = m_chwDirAttr; int cComponentsSave = m_cComponents; int cnUserDefnSave = m_cnUserDefn; int cnCompPerLigSave = m_cnCompPerLig; int grfsdcSave = m_grfsdc; - wchar chwLBGlyphIDSave = m_chwLBGlyphID; + grwchar chwLBGlyphIDSave = m_chwLBGlyphID; int cpsdSave = m_cpsd; int dipsdInitSave = m_dipsdInit; int cPsdLoopSave = m_cPsdLoop; @@ -2224,9 +2241,9 @@ /*---------------------------------------------------------------------------------------------- Return the glyph ID for the given Unicode value. ----------------------------------------------------------------------------------------------*/ -wchar GrEngine::GetGlyphIDFromUnicode(int nUnicode) +grwchar GrEngine::GetGlyphIDFromUnicode(int nUnicode) { - wchar chwGlyphID = MapToPseudo(nUnicode); + grwchar chwGlyphID = MapToPseudo(nUnicode); if (chwGlyphID != 0) return chwGlyphID; // return a pseudo-glyph @@ -2249,7 +2266,7 @@ /*---------------------------------------------------------------------------------------------- Return the pseudo-glyph corresponding to the given Unicode input, or 0 if none. ----------------------------------------------------------------------------------------------*/ -wchar GrEngine::MapToPseudo(int nUnicode) +grwchar GrEngine::MapToPseudo(int nUnicode) { if (m_cpsd == 0) return 0; @@ -2294,9 +2311,9 @@ is just the glyph ID we're already working with, but for pseudo-glyphs it will something different. ----------------------------------------------------------------------------------------------*/ -wchar GrEngine::ActualGlyphForOutput(wchar chwGlyphID) +grwchar GrEngine::ActualGlyphForOutput(grwchar chwGlyphID) { - wchar chwActual = GlyphAttrValue(chwGlyphID, m_chwPseudoAttr); + grwchar chwActual = GlyphAttrValue(chwGlyphID, m_chwPseudoAttr); if (chwActual == 0) return chwGlyphID; // not a pseudo, we're already working with the actual glyph ID else @@ -2326,8 +2343,8 @@ } } - int cchw = (lSize / isizeof(wchar)) + 1; - wchar * pchwName = NewObj wchar[cchw]; // lSize - byte count for Uni str + int cchw = (lSize / isizeof(grwchar)) + 1; + grwchar * pchwName = NewObj grwchar[cchw]; // lSize - byte count for Uni str memcpy(pchwName, (BYTE *)m_pNameTbl + lOffset, lSize); pchwName[cchw - 1] = 0; // zero terminate if (TtfUtil::SwapWString(pchwName, cchw - 1)) @@ -2413,7 +2430,7 @@ ----------------------------------------------------------------------------------------------*/ void GrEngine::InitSlot(GrSlotState * pslot) { - wchar chwGlyphID = pslot->GlyphID(); + grwchar chwGlyphID = pslot->GlyphID(); if (m_pgtbl) { // Initialize from glyph table @@ -2478,17 +2495,17 @@ /*---------------------------------------------------------------------------------------------- Methods to pass on to the tables. ----------------------------------------------------------------------------------------------*/ -wchar GrEngine::GetClassGlyphIDAt(int nClass, int nIndex) +grwchar GrEngine::GetClassGlyphIDAt(int nClass, int nIndex) { return m_pctbl->GetGlyphID(nClass, nIndex); } -int GrEngine::GetIndexInGlyphClass(int nClass, wchar chwGlyphID) +int GrEngine::GetIndexInGlyphClass(int nClass, grwchar chwGlyphID) { return m_pctbl->FindIndex(nClass, chwGlyphID); } -int GrEngine::GlyphAttrValue(wchar chwGlyphID, int nAttrID) +int GrEngine::GlyphAttrValue(grwchar chwGlyphID, int nAttrID) { #ifdef OLD_TEST_STUFF if (!m_pgtbl) // test procedures @@ -2498,7 +2515,7 @@ return m_pgtbl->GlyphAttrValue(chwGlyphID, nAttrID); } -int GrEngine::ComponentIndexForGlyph(wchar chwGlyphID, int nCompID) +int GrEngine::ComponentIndexForGlyph(grwchar chwGlyphID, int nCompID) { #ifdef OLD_TEST_STUFF if (!m_pgtbl) // test procedures Index: GrFSM.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrFSM.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrFSM.cpp 14 Apr 2003 21:34:29 -0000 1.3 +++ GrFSM.cpp 16 Apr 2003 19:59:50 -0000 1.4 @@ -79,8 +79,8 @@ } // rule map and offsets (extra item at end gives final offset, ie, total) - m_prgirulnMin = NewObj wchar[crowSuccess + 1]; - wchar * pchw = m_prgirulnMin; + m_prgirulnMin = NewObj grwchar[crowSuccess + 1]; + grwchar * pchw = m_prgirulnMin; int i; for (i = 0; i < (crowSuccess + 1); i++, pchw++) { @@ -93,7 +93,7 @@ // than one state. int crulInMap = m_prgirulnMin[crowSuccess]; - m_prgrulnMatched = NewObj wchar[crulInMap]; + m_prgrulnMatched = NewObj grwchar[crulInMap]; pchw = m_prgrulnMatched; for (i = 0; i < crulInMap; i++, pchw++) { @@ -289,7 +289,7 @@ return (prowTop - prgrowAccepting); // Get next glyph. - wchar chwGlyphID = (cslot < 0) ? + grwchar chwGlyphID = (cslot < 0) ? psstrmOut->PeekBack(cslot)->GlyphID() : psstrmIn->Peek(cslot)->GlyphID(); @@ -348,7 +348,7 @@ // no more input return (prowTop - prgrowAccepting); - wchar chwGlyphID = psstrmIn->Peek(cslot)->GlyphID(); + grwchar chwGlyphID = psstrmIn->Peek(cslot)->GlyphID(); int col = FindColumn(chwGlyphID); short cellValue = *(m_prgprgrowXitions + ichwRowOffset + col); @@ -444,7 +444,7 @@ Search for the class range containing the glyph ID, and return the matching FSM column. Does a fast binary search that uses only shifts, no division. ----------------------------------------------------------------------------------------------*/ -int GrFSM::FindColumn(wchar chwGlyphID) +int GrFSM::FindColumn(grwchar chwGlyphID) { #ifdef _DEBUG // Check that the pre-calculated constants are correct. Index: GrFSM.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrFSM.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrFSM.h 14 Apr 2003 21:34:29 -0000 1.3 +++ GrFSM.h 16 Apr 2003 19:59:52 -0000 1.4 @@ -37,9 +37,9 @@ friend class GrFSM; protected: - wchar m_chwFirst; // first glyph ID in range - wchar m_chwLast; // last glyph ID in range - wchar m_col; // column (machine class) to which this range maps + grwchar m_chwFirst; // first glyph ID in range + grwchar m_chwLast; // last glyph ID in range + grwchar m_col; // column (machine class) to which this range maps }; /*---------------------------------------------------------------------------------------------- @@ -152,7 +152,7 @@ } protected: - int FindColumn(wchar chwGlyphID); + int FindColumn(grwchar chwGlyphID); protected: // Instance variables: int m_crow; // number of rows (states) @@ -162,11 +162,11 @@ int m_ccol; // number of columns (machine classes) - wchar * m_prgirulnMin; // m_crow-m_crowNonAcpt+1 of these; + grwchar * m_prgirulnMin; // m_crow-m_crowNonAcpt+1 of these; // index within m_prgrulnMatched, start of matched // rules for each accepting state - wchar * m_prgrulnMatched; // long ordered list of rule indices matched by + grwchar * m_prgrulnMatched; // long ordered list of rule indices matched by // subsequent states; total length is sum of number // of rules matched for each accepting state @@ -180,15 +180,15 @@ short * m_prgrowTransitions; // ((m_crow-m_crowFinal) * m_ccol) of these // debugger string offsets - wchar * m_prgibStateDebug; // for transition states; (m_crow-m_crul+1) of these + grwchar * m_prgibStateDebug; // for transition states; (m_crow-m_crul+1) of these // constants for fast binary search; these are generated by the compiler so that the // engine doesn't have to take time to do it - wchar m_dimcrInit; // (max power of 2 <= m_cmcr); + grwchar m_dimcrInit; // (max power of 2 <= m_cmcr); // size of initial range to consider - wchar m_cLoop; // log2(max power of 2 <= m_cmcr); + grwchar m_cLoop; // log2(max power of 2 <= m_cmcr); // indicates how many iterations are necessary - wchar m_imcrStart; // m_cmcr - m_dimcrInit; + grwchar m_imcrStart; // m_cmcr - m_dimcrInit; // where to start search int m_cmcr; // number of machine-class-ranges Index: GrGlyphTable.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrGlyphTable.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrGlyphTable.cpp 14 Apr 2003 21:34:30 -0000 1.2 +++ GrGlyphTable.cpp 16 Apr 2003 19:59:52 -0000 1.3 @@ -124,7 +124,7 @@ /*---------------------------------------------------------------------------------------------- Initialization. ----------------------------------------------------------------------------------------------*/ -void GrGlyphSubTable::Initialize(int nVersion, wchar chwFlags, int cGlyphs, int cAttrs, +void GrGlyphSubTable::Initialize(int nVersion, grwchar chwFlags, int cGlyphs, int cAttrs, int cnCompPerLig) { m_nVersion = nVersion; @@ -144,7 +144,7 @@ if (m_fHasDebugStrings) { - m_prgibBIGGlyphAttrDebug = NewObj wchar[cAttrs + 1]; + m_prgibBIGGlyphAttrDebug = NewObj grwchar[cAttrs + 1]; } // Make a cache to hold a list of defined components for each glyph. This is @@ -161,7 +161,7 @@ /*---------------------------------------------------------------------------------------------- Return the attribute value for the given glyph. ----------------------------------------------------------------------------------------------*/ -int GrGlyphSubTable::GlyphAttrValue(wchar chwGlyphID, int nAttrID) +int GrGlyphSubTable::GlyphAttrValue(grwchar chwGlyphID, int nAttrID) { if (m_nAttrIDLim == 0) { @@ -204,7 +204,7 @@ else if (gatrun.m_bMinAttrID + gatrun.m_cAttrs > bAttrID) { // Found the value in this run. - wchar chw = lsbf(gatrun.m_rgchwBIGValues[bAttrID - gatrun.m_bMinAttrID]); + grwchar chw = lsbf(gatrun.m_rgchwBIGValues[bAttrID - gatrun.m_bMinAttrID]); if ((chw & 0x8000) == 0) return (int)chw; else @@ -227,7 +227,7 @@ defined for this glyph. CURRENTLY NOT USED ----------------------------------------------------------------------------------------------*/ -int GrGlyphSubTable::ComponentContainingPoint(wchar chwGlyphID, int x, int y) +int GrGlyphSubTable::ComponentContainingPoint(grwchar chwGlyphID, int x, int y) { int i = CalculateDefinedComponents(chwGlyphID); for (int inComp = 0; inComp < m_cnCompPerLig; inComp++) @@ -274,7 +274,7 @@ - return values, in source device coordinates ----------------------------------------------------------------------------------------------*/ bool GrGlyphSubTable::ComponentBoxLogUnits(IGrGraphics * pgg, - wchar chwGlyphID, int icomp, int mFontEmUnits, int dysFontAscent, + grwchar chwGlyphID, int icomp, int mFontEmUnits, int dysFontAscent, int * pxsLeft, int * pysTop, int * pxsRight, int * pysBottom) { int i = CalculateDefinedComponents(chwGlyphID); @@ -342,7 +342,7 @@ TODO: With the current implementation that stores the glyph ids in each slot, this mechanism is redundant and obsolete, and should be removed. ----------------------------------------------------------------------------------------------*/ -int GrGlyphSubTable::CalculateDefinedComponents(wchar chwGlyphID) +int GrGlyphSubTable::CalculateDefinedComponents(grwchar chwGlyphID) { // The first item is a flag indicating whether the list has been calculated; hence // the "+1" in the expresson below. @@ -375,7 +375,7 @@ @param nAttrID - the attribute of interest, assumed to be a component glyph attribute (eg. component.e.top) ----------------------------------------------------------------------------------------------*/ -bool GrGlyphSubTable::ComponentIsDefined(wchar chwGlyphID, int nAttrID) +bool GrGlyphSubTable::ComponentIsDefined(grwchar chwGlyphID, int nAttrID) { Assert(nAttrID < m_cComponents); if (nAttrID >= m_cComponents) @@ -390,7 +390,7 @@ For instance, given the glyph ID "oe" (the oe ligature) and the attr ID for component.o, the result would be 0; for component.e the result would be 1. ----------------------------------------------------------------------------------------------*/ -int GrGlyphSubTable::ComponentIndexForGlyph(wchar chwGlyphID, int nCompID) +int GrGlyphSubTable::ComponentIndexForGlyph(grwchar chwGlyphID, int nCompID) { int i = CalculateDefinedComponents(chwGlyphID); @@ -405,7 +405,7 @@ /*---------------------------------------------------------------------------------------------- Return the ID of the nth defined component attribute for the given glyph. ----------------------------------------------------------------------------------------------*/ -//int GrGlyphSubTable::NthComponentID(wchar chwGlyphID, int n) +//int GrGlyphSubTable::NthComponentID(grwchar chwGlyphID, int n) //{ // int i = CalculateDefinedComponents(chwGlyphID); // return m_pnComponents[i + 1 + n]; @@ -435,7 +435,7 @@ /*********************************************************************************************** TODO: This method is BROKEN because m_prgibBIGAttrValues has been changed. It is no - longer a wchar *. The Gloc table can contain 16-bit or 32-bit entries and must be + longer a grwchar *. The Gloc table can contain 16-bit or 32-bit entries and must be accessed accordingly. ***********************************************************************************************/ void GrGlyphSubTable::SetUpTestData() @@ -443,12 +443,12 @@ m_pgatbl = NewObj GrGlyphAttrTable(); m_pgatbl->Initialize(0, 48); - m_prgibBIGAttrValues[0] = (byte)msbf(wchar(0)); - m_prgibBIGAttrValues[1] = (byte)msbf(wchar(6)); - m_prgibBIGAttrValues[2] = (byte)msbf(wchar(20)); - m_prgibBIGAttrValues[3] = (byte)msbf(wchar(20)); - m_prgibBIGAttrValues[4] = (byte)msbf(wchar(40)); - m_prgibBIGAttrValues[5] = (byte)msbf(wchar(48)); + m_prgibBIGAttrValues[0] = (byte)msbf(grwchar(0)); + m_prgibBIGAttrValues[1] = (byte)msbf(grwchar(6)); + m_prgibBIGAttrValues[2] = (byte)msbf(grwchar(20)); + m_prgibBIGAttrValues[3] = (byte)msbf(grwchar(20)); + m_prgibBIGAttrValues[4] = (byte)msbf(grwchar(40)); + m_prgibBIGAttrValues[5] = (byte)msbf(grwchar(48)); m_pgatbl->SetUpTestData(); } @@ -499,23 +499,23 @@ // Glyph 0 gatrun.m_bMinAttrID = 1; gatrun.m_cAttrs = 2; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(11)); - gatrun.m_rgchwBIGValues[1] = msbf(wchar(22)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(11)); + gatrun.m_rgchwBIGValues[1] = msbf(grwchar(22)); memcpy(pbBIG, &gatrun, 6); pbBIG += 6; // Glyph 1 gatrun.m_bMinAttrID = 0; gatrun.m_cAttrs = 3; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(5)); - gatrun.m_rgchwBIGValues[1] = msbf(wchar(6)); - gatrun.m_rgchwBIGValues[2] = msbf(wchar(7)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(5)); + gatrun.m_rgchwBIGValues[1] = msbf(grwchar(6)); + gatrun.m_rgchwBIGValues[2] = msbf(grwchar(7)); memcpy(pbBIG, &gatrun, 8); pbBIG += 8; gatrun.m_bMinAttrID = 8; gatrun.m_cAttrs = 2; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(8)); - gatrun.m_rgchwBIGValues[1] = msbf(wchar(9)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(8)); + gatrun.m_rgchwBIGValues[1] = msbf(grwchar(9)); memcpy(pbBIG, &gatrun, 6); pbBIG += 6; @@ -524,36 +524,36 @@ // Glyph 3 gatrun.m_bMinAttrID = 1; gatrun.m_cAttrs = 1; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(111)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(111)); memcpy(pbBIG, &gatrun, 4); pbBIG += 4; gatrun.m_bMinAttrID = 3; gatrun.m_cAttrs = 1; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(333)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(333)); memcpy(pbBIG, &gatrun, 4); pbBIG += 4; gatrun.m_bMinAttrID = 5; gatrun.m_cAttrs = 1; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(555)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(555)); memcpy(pbBIG, &gatrun, 4); pbBIG += 4; gatrun.m_bMinAttrID = 7; gatrun.m_cAttrs = 1; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(777)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(777)); memcpy(pbBIG, &gatrun, 4); pbBIG += 4; gatrun.m_bMinAttrID = 9; gatrun.m_cAttrs = 1; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(999)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(999)); memcpy(pbBIG, &gatrun, 4); pbBIG += 4; // Glyph 4 gatrun.m_bMinAttrID = 5; gatrun.m_cAttrs = 3; - gatrun.m_rgchwBIGValues[0] = msbf(wchar(4)); - gatrun.m_rgchwBIGValues[1] = msbf(wchar(4)); - gatrun.m_rgchwBIGValues[2] = msbf(wchar(4)); + gatrun.m_rgchwBIGValues[0] = msbf(grwchar(4)); + gatrun.m_rgchwBIGValues[1] = msbf(grwchar(4)); + gatrun.m_rgchwBIGValues[2] = msbf(grwchar(4)); memcpy(pbBIG, &gatrun, 8); pbBIG += 8; Index: GrGlyphTable.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrGlyphTable.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrGlyphTable.h 7 Nov 2002 13:59:51 -0000 1.2 +++ GrGlyphTable.h 16 Apr 2003 19:59:52 -0000 1.3 @@ -70,18 +70,18 @@ // Removed from release build for optimization memset(m_rgchwBIGValues, 0, isizeof(m_rgchwBIGValues)); #endif - memcpy(m_rgchwBIGValues, pbBIGEnt + 2, (m_cAttrs * isizeof(wchar))); + memcpy(m_rgchwBIGValues, pbBIGEnt + 2, (m_cAttrs * isizeof(grwchar))); } int ByteCount() { - return (2 + (m_cAttrs * isizeof(wchar))); + return (2 + (m_cAttrs * isizeof(grwchar))); } protected: byte m_bMinAttrID; // ID of first attribute in the run byte m_cAttrs; // number of attributes in the run - wchar m_rgchwBIGValues[kMaxAttrsPerRun]; + grwchar m_rgchwBIGValues[kMaxAttrsPerRun]; }; /*---------------------------------------------------------------------------------------------- @@ -168,7 +168,7 @@ // Initialization: void ReadFromFont(GrIStream & grstrm, int cGlyphs, long lGlatStart); - void Initialize(int nVersion, wchar chwFlags, int cGlyphs, int cAttrs, int cnCompPerLig); + void Initialize(int nVersion, grwchar chwFlags, int cGlyphs, int cAttrs, int cnCompPerLig); void CreateEmpty(); @@ -180,30 +180,30 @@ // General: int NumberOfGlyphAttrs() { return m_nAttrIDLim; } // 0..(m_nAttrIDLim-1) - int GlyphAttrValue(wchar chwGlyphID, int nAttrID); + int GlyphAttrValue(grwchar chwGlyphID, int nAttrID); // Ligatures: - int ComponentContainingPoint(wchar chwGlyphID, int x, int y); - bool ComponentBoxLogUnits(IGrGraphics * pgg, wchar chwGlyphID, int icomp, + int ComponentContainingPoint(grwchar chwGlyphID, int x, int y); + bool ComponentBoxLogUnits(IGrGraphics * pgg, grwchar chwGlyphID, int icomp, int mFontEmUnits, int dysAscent, int * pxsLeft, int * pysTop, int * pxsRight, int * pysBottom); protected: - int CalculateDefinedComponents(wchar chwGlyphID); - bool ComponentIsDefined(wchar chwGlyphID, int nAttrID); - int ComponentIndexForGlyph(wchar chwGlyphID, int nCompID); -// int NthComponentID(wchar chwGlyphID, int n); + int CalculateDefinedComponents(grwchar chwGlyphID); + bool ComponentIsDefined(grwchar chwGlyphID, int nAttrID); + int ComponentIndexForGlyph(grwchar chwGlyphID, int nCompID); +// int NthComponentID(grwchar chwGlyphID, int n); public: // Flags: - bool LongFormat(wchar chwFlags) // 32-bit values? + bool LongFormat(grwchar chwFlags) // 32-bit values? { return ((chwFlags & 0x01) == 0x01); // bit 0 } - bool HasAttrNames(wchar chwFlags) + bool HasAttrNames(grwchar chwFlags) { return ((chwFlags & 0x02) == 0x02); // bit 1 } - int GlocLookup(wchar chwGlyphId) + int GlocLookup(grwchar chwGlyphId) { if (m_fGlocShort) { @@ -228,7 +228,7 @@ GrGlyphAttrTable * m_pgatbl; byte * m_prgibBIGAttrValues; // byte offsets for glyph attr values bool m_fGlocShort; // flag for Gloc table format - wchar * m_prgibBIGGlyphAttrDebug; // byte offsets for glyph attr debug strings + grwchar * m_prgibBIGGlyphAttrDebug; // byte offsets for glyph attr debug strings int * m_prgnDefinedComponents; // for each glyph, cache list of component attributes that // are defined @@ -313,30 +313,30 @@ return m_vpgstbl[0]->NumberOfGlyphAttrs(); } - int GlyphAttrValue(wchar chwGlyphID, int nAttrID) + int GlyphAttrValue(grwchar chwGlyphID, int nAttrID) { Assert(m_cgstbl == 1); return m_vpgstbl[0]->GlyphAttrValue(chwGlyphID, nAttrID); } // Eventually: - //int GlyphAttrValue(wchar chwGlyphID, int nAttrID, int nStyleIndex) + //int GlyphAttrValue(grwchar chwGlyphID, int nAttrID, int nStyleIndex) //{ // return m_vpgstbl[nStyleIndex]->GlyphAttrValue(chwGlyphID, nAttrID); //} - int ComponentContainingPoint(wchar chwGlyphID, int x, int y) + int ComponentContainingPoint(grwchar chwGlyphID, int x, int y) { Assert(m_cgstbl == 1); return m_vpgstbl[0]->ComponentContainingPoint(chwGlyphID, x, y); } // Eventually: - //int ComponentContainingPoint(wchar chwGlyphID, int nStyleIndex, int x, int y) + //int ComponentContainingPoint(grwchar chwGlyphID, int nStyleIndex, int x, int y) //{ // Assert(m_cgstbl == 1); // return m_vpgstbl[nStyleIndex]->ComponentContainingPoint(chwGlyphID, nAttrID); //} - bool ComponentBoxLogUnits(IGrGraphics * pgg, wchar chwGlyphID, int icomp, + bool ComponentBoxLogUnits(IGrGraphics * pgg, grwchar chwGlyphID, int icomp, int mFontEmUnits, int dysAscent, int * pxsLeft, int * pysTop, int * pxsRight, int * pysBottom) { @@ -345,7 +345,7 @@ pxsLeft, pysTop, pxsRight, pysBottom); } - int ComponentIndexForGlyph(wchar chwGlyphID, int nCompID) + int ComponentIndexForGlyph(grwchar chwGlyphID, int nCompID) { Assert(m_cgstbl == 1); return m_vpgstbl[0]->ComponentIndexForGlyph(chwGlyphID, nCompID); Index: GrPass.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPass.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrPass.cpp 14 Apr 2003 21:34:30 -0000 1.5 +++ GrPass.cpp 16 Apr 2003 19:59:52 -0000 1.6 @@ -138,8 +138,8 @@ m_pfsm->ReadFromFont(grstrm, nVersion); // rule sort keys - m_prgchwRuleSortKeys = NewObj wchar[m_crul]; - wchar * pchw = m_prgchwRuleSortKeys; + m_prgchwRuleSortKeys = NewObj grwchar[m_crul]; + grwchar * pchw = m_prgchwRuleSortKeys; int irul; for (irul = 0; irul < m_crul; irul++, pchw++) { @@ -164,14 +164,14 @@ m_cbPassConstraint = 0; // constraint and action offsets for rules - m_prgibConstraintStart = NewObj wchar[m_crul + 1]; + m_prgibConstraintStart = NewObj grwchar[m_crul + 1]; pchw = m_prgibConstraintStart; for (irul = 0; irul <= m_crul; irul++, pchw++) { *pchw = grstrm.ReadUShortFromFont(); } - m_prgibActionStart = NewObj wchar[m_crul + 1]; + m_prgibActionStart = NewObj grwchar[m_crul + 1]; pchw = m_prgibActionStart; for (irul = 0; irul <= m_crul; irul++, pchw++) { @@ -241,7 +241,7 @@ NeededToResync() - psstrmOut->WritePos()); int cslotGot = 0; - wchar chwLB = ptman->LBGlyphID(); + grwchar chwLB = ptman->LBGlyphID(); // While we haven't got the number of slot we've been asked for, and there is enough // available in the input, run rules, filling up the output. @@ -578,7 +578,7 @@ GrFeatureValues fval; LgCharRenderProps * pchrp = NULL; int nUnicode = pchstrm->NextGet(ptman, &fval, &pchrp, &ichwSegOffset, &cchw); - wchar chwGlyphID = ptman->GetGlyphIDFromUnicode(nUnicode); + grwchar chwGlyphID = ptman->GetGlyphIDFromUnicode(nUnicode); GrSlotState * pslotNew; ptman->NewSlot(chwGlyphID, fval, pchrp, 0, ichwSegOffset, &pslotNew); Index: GrPass.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPass.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrPass.h 14 Apr 2003 21:34:30 -0000 1.3 +++ GrPass.h 16 Apr 2003 19:59:54 -0000 1.4 @@ -309,18 +309,18 @@ int m_crul; // number of rules // rule sort keys, indicating precedence of rules; m_crul of these - wchar * m_prgchwRuleSortKeys; + grwchar * m_prgchwRuleSortKeys; // for each rule, the number of items in the context before the first modified item // that the constraints need to be tested on byte * m_prgcritRulePreModContext; // offset for pass-level constraints; just 1 of these - wchar m_cbPassConstraint; + grwchar m_cbPassConstraint; // offsets for constraint and action code; m_crul+1 of each of these (the last // indicates the total byte count) - wchar * m_prgibConstraintStart; - wchar * m_prgibActionStart; + grwchar * m_prgibConstraintStart; + grwchar * m_prgibActionStart; // blocks of constraint and action code byte * m_prgbPConstraintBlock; // pass-level constraints @@ -328,8 +328,8 @@ byte * m_prgbActionBlock; bool m_fHasDebugStrings; - wchar * m_prgibConstraintDebug; // m_crul+1 of these - wchar * m_prgibRuleDebug; // m_crul+1 of these + grwchar * m_prgibConstraintDebug; // m_crul+1 of these + grwchar * m_prgibRuleDebug; // m_crul+1 of these // For logging transduction process: struct RuleRecord Index: GrPassActionCode.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPassActionCode.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrPassActionCode.cpp 14 Apr 2003 21:34:31 -0000 1.3 +++ GrPassActionCode.cpp 16 Apr 2003 19:59:54 -0000 1.4 @@ -593,7 +593,7 @@ else pslotNextInput = (fInserting)? psstrmIn->Peek(): psstrmIn->NextGet(); - wchar nGlyphReplacement = ptman->GetClassGlyphIDAt(nReplacementClass, 0); + grwchar nGlyphReplacement = ptman->GetClassGlyphIDAt(nReplacementClass, 0); GrSlotState * pslotNew; if (fInserting) @@ -684,10 +684,10 @@ GrSlotState * pslotInSelector = psstrmIn->RuleInputSlot(cslotSel, psstrmOut); - wchar nGlyphSelector = pslotInSelector->GlyphID(); + grwchar nGlyphSelector = pslotInSelector->GlyphID(); int nSelIndex = ptman->GetIndexInGlyphClass(nSelClass, nGlyphSelector); Assert(nSelIndex != -1); - wchar nGlyphReplacement = (nSelIndex == -1)? + grwchar nGlyphReplacement = (nSelIndex == -1)? nGlyphSelector: ptman->GetClassGlyphIDAt(nReplacementClass, nSelIndex); Index: GrPseudoMap.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPseudoMap.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrPseudoMap.h 14 Apr 2003 21:34:31 -0000 1.3 +++ GrPseudoMap.h 16 Apr 2003 19:59:55 -0000 1.4 @@ -29,15 +29,15 @@ { public: unsigned int Unicode() { return m_nUnicode; } - wchar PseudoGlyph() { return m_chwPseudo; } + grwchar PseudoGlyph() { return m_chwPseudo; } - void SetUnicode(int n) { m_nUnicode = n; } - void SetPseudoGlyph(wchar chw) { m_chwPseudo = chw; } + void SetUnicode(int n) { m_nUnicode = n; } + void SetPseudoGlyph(grwchar chw) { m_chwPseudo = chw; } protected: // Instance variables: unsigned int m_nUnicode; - wchar m_chwPseudo; + grwchar m_chwPseudo; }; #endif // !GR_PSEUDOMAP_INCLUDED Index: GrSegment.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSegment.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrSegment.cpp 14 Apr 2003 21:34:31 -0000 1.5 +++ GrSegment.cpp 16 Apr 2003 19:59:55 -0000 1.6 @@ -710,7 +710,7 @@ /*---------------------------------------------------------------------------------------------- Get the old writing system used by this segment. ----------------------------------------------------------------------------------------------*/ -GrResult GrSegment::get_OldWritingSystem(int ichwBase, int * pws, int * pows) +GrResult GrSegment::get_WritingSystem(int ichwBase, int * pws, int * pows) { ChkGrOutPtr(pws); ChkGrOutPtr(pows); @@ -1987,7 +1987,7 @@ Create the arrays to store the final output and association information. ----------------------------------------------------------------------------------------------*/ void GrSegment::SetUpOutputArrays(GrTableManager * ptman, GrSlotStream * psstrmFinal, - int cchwInThisSeg, int csloutSurface, wchar chwLB, + int cchwInThisSeg, int csloutSurface, grwchar chwLB, LgTrailingWsHandling twsh, bool fParaRtl, int nDirDepth, bool fEmpty) { Index: GrSlotState.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrSlotState.cpp 14 Apr 2003 21:34:31 -0000 1.4 +++ GrSlotState.cpp 16 Apr 2003 19:59:56 -0000 1.5 @@ -149,7 +149,7 @@ Return the ID of the actual glyph that will be used for output and metrics. This is the same for most glyphs, but will be different for pseudo-glyphs. ----------------------------------------------------------------------------------------------*/ -wchar GrSlotAbstract::ActualGlyphForOutput(GrTableManager * ptman) +grwchar GrSlotAbstract::ActualGlyphForOutput(GrTableManager * ptman) { if (m_chwActual == kInvalidGlyph) m_chwActual = ptman->ActualGlyphForOutput(m_chwGlyphID); @@ -564,7 +564,7 @@ } -int GrSlotAbstract::GetGlyphMetric(IGrGraphics * pgg, int nMetricID, wchar chwGlyphID) +int GrSlotAbstract::GetGlyphMetric(IGrGraphics * pgg, int nMetricID, grwchar chwGlyphID) { GrResult res; int xysRet = 0; Index: GrSlotState.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrSlotState.h 2 Jan 2003 21:18:47 -0000 1.3 +++ GrSlotState.h 16 Apr 2003 19:59:57 -0000 1.4 @@ -98,10 +98,10 @@ m_prgnVarLenBuf = pn; } - wchar GlyphID() { return m_chwGlyphID; } - wchar RawActualGlyph() { return m_chwActual; } + grwchar GlyphID() { return m_chwGlyphID; } + grwchar RawActualGlyph() { return m_chwActual; } int IsSpace(GrTableManager * ptman); - int GetGlyphMetric(IGrGraphics * pgg, int nGlyphMetricID, wchar chwGlyphID); + int GetGlyphMetric(IGrGraphics * pgg, int nGlyphMetricID, grwchar chwGlyphID); int StyleIndex() { return m_nStyleIndex; } void GetFeatureValues(GrFeatureValues * pfval) @@ -192,7 +192,7 @@ m_islotPosPass = kNotYetSet; } - wchar ActualGlyphForOutput(GrTableManager * ptman); + grwchar ActualGlyphForOutput(GrTableManager * ptman); // Variable-length buffer: @@ -258,8 +258,8 @@ } protected: - wchar m_chwGlyphID; - wchar m_chwActual; // actual glyph to output (which is a different glyph for pseudos) + grwchar m_chwGlyphID; + grwchar m_chwActual; // actual glyph to output (which is a different glyph for pseudos) int m_islotPosPass; // index of slot in positioning streams, relative to first official // slot in the segment (possibly the LB slot) @@ -379,7 +379,7 @@ // General: int RawSegOffset() { return m_ichwSegOffset; } - void SetGlyphID(wchar chw) + void SetGlyphID(grwchar chw) { m_chwGlyphID = chw; m_chwActual = kInvalidGlyph; @@ -423,15 +423,15 @@ { } - bool IsLineBreak(wchar chwLB) + bool IsLineBreak(grwchar chwLB) { return (m_chwGlyphID == chwLB); } - bool IsInitialLineBreak(wchar chwLB) + bool IsInitialLineBreak(grwchar chwLB) { return (IsLineBreak(chwLB) && m_fInitialL... [truncated message content] |
From: <sil...@li...> - 2003-04-16 20:00:48
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv3270/include Modified Files: GrCommon.h GrEngine.h GrSegment.h Log Message: Synchronized with FW, 16 Apr 2003, changelist #6720 Index: GrCommon.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrCommon.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrCommon.h 1 Apr 2003 22:23:36 -0000 1.2 +++ GrCommon.h 16 Apr 2003 19:59:37 -0000 1.3 @@ -148,6 +148,8 @@ typedef achar * Psz; typedef const achar * Pcsz; +typedef wchar grwchar; + /************************************************************************************* Offsets and addresses. AddrOf is useful for taking the address of an object Index: GrEngine.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrEngine.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- GrEngine.h 14 Apr 2003 21:34:25 -0000 1.6 +++ GrEngine.h 16 Apr 2003 19:59:37 -0000 1.7 @@ -116,23 +116,23 @@ int * pdichwContext, OLECHAR * prgchwErrMsg, int cchMaxErrMsg); - wchar GetGlyphIDFromUnicode(int nUnicode); - wchar ActualGlyphForOutput(wchar chwGlyphID); + grwchar GetGlyphIDFromUnicode(int nUnicode); + grwchar ActualGlyphForOutput(grwchar chwGlyphID); int GetFontEmUnits() { return m_mFontEmUnits; } - wchar LBGlyphID() + grwchar LBGlyphID() { return m_chwLBGlyphID; } - wchar GetClassGlyphIDAt(int nClass, int nIndex); - int GetIndexInGlyphClass(int nClass, wchar chwGlyphID); - int GlyphAttrValue(wchar chwGlyphID, int nAttrID); - int ComponentIndexForGlyph(wchar chwGlyphID, int nCompID); + grwchar GetClassGlyphIDAt(int nClass, int nIndex); + int GetIndexInGlyphClass(int nClass, grwchar chwGlyphID); + int GlyphAttrValue(grwchar chwGlyphID, int nAttrID); + int ComponentIndexForGlyph(grwchar chwGlyphID, int nCompID); void InitFontName(); void RecordFontLoadError(OLECHAR * prgchwErrMsg, int cchMaxErrMsg); @@ -265,13 +265,7 @@ return 2; } - static int ReadVersion(GrIStream & grstrm) - { - int nVersion = grstrm.ReadIntFromFont(); - if (nVersion == 0x00010000) - nVersion = 0x00000001; // kludge for silly mistake - return nVersion; - } + static int ReadVersion(GrIStream & grstrm); protected: // Member variables: @@ -345,11 +339,11 @@ int m_cchwPostXlbContext; // magic glyph attribute numbers - wchar m_chwPseudoAttr; // actual-for-pseudo fake glyph attribute - wchar m_chwBWAttr; // break-weight - wchar m_chwDirAttr; // directionality + grwchar m_chwPseudoAttr; // actual-for-pseudo fake glyph attribute + grwchar m_chwBWAttr; // break-weight + grwchar m_chwDirAttr; // directionality - wchar m_chwLBGlyphID; // magic line-break glyph ID + grwchar m_chwLBGlyphID; // magic line-break glyph ID int m_cComponents; // number of glyph attributes at the beginning of the glyph table // that actually represent ligature components @@ -411,7 +405,7 @@ void CreateEmpty(); - wchar MapToPseudo(int nUnicode); + grwchar MapToPseudo(int nUnicode); //:Ignore #ifdef OLD_TEST_STUFF Index: GrSegment.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrSegment.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrSegment.h 14 Apr 2003 21:34:26 -0000 1.5 +++ GrSegment.h 16 Apr 2003 19:59:37 -0000 1.6 @@ -78,7 +78,7 @@ GrResult get_RightToLeft(int ichwBase, bool * pfResult); GrResult get_DirectionDepth(int ichwBase, int * pnDepth, bool * pfWeak); GrResult SetDirectionDepth(int ichwBase, int nNewDepth); - GrResult get_OldWritingSystem(int ichwBase, int * pws, int * pows); + GrResult get_WritingSystem(int ichwBase, int * pws, int * pows); GrResult get_Lim(int ichwBase, int * pdichw); GrResult get_LimInterest(int ichwBase, int * pdichw); @@ -210,7 +210,7 @@ int clrFore, int clrBack, bool fBackColor); void SetUpOutputArrays(GrTableManager * ptm, GrSlotStream * psstrmFinal, - int cchwUnderlying, int csloutSurface, wchar chwLB, + int cchwUnderlying, int csloutSurface, grwchar chwLB, LgTrailingWsHandling twsh, bool fParaRtl, int nDirDepth, bool fEmpty = false); void ShiftGlyphs(int dxsShift); |
From: <sil...@li...> - 2003-04-16 16:38:34
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1:/tmp/cvs-serv8671 Modified Files: Makefile.PL makefile.vc Log Message: Fixed small problem in makefile Index: Makefile.PL =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/Makefile.PL,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Makefile.PL 11 Nov 2002 15:51:02 -0000 1.2 +++ Makefile.PL 16 Apr 2003 16:38:22 -0000 1.3 @@ -110,9 +110,11 @@ my ($o) = "$s"; my ($od) = "$s"; my ($sbr) = "$s"; + my ($sbrd) = "$s"; $o =~ s|^(.*)/(.*?)\.cpp|\$(INTDIR)\\$2\$(OBJEXT)|o; $od =~ s|^(.*)/(.*?)\.cpp|\$(INTDIR)\\$2_dll\$(OBJEXT)|o; $sbr =~ s|^(.*)/(.*?)\.cpp|\$(INTDIR)\\$2\$(SBREXT)|o; + $sbrd =~ s|^(.*)/(.*?)\.cpp|\$(INTDIR)\\$2_dll\$(SBREXT)|o; # we should probably do proper dependencies here - sigh! @@ -123,7 +125,7 @@ \"$o\" \"$sbr\" : \"$s\" @- \$(CPP) \$(CPPFLAGS) \$(CPP_DEBUG) /Fo"$o" \$? -\"$od\" \"$sbr\" : \"$s\" +\"$od\" \"$sbrd\" : \"$s\" @- \$(CPP) \$(CPPFLAGS) /D "_DLL" \$(CPP_DEBUG) /Fo"$od" \$? !ELSE Index: makefile.vc =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/makefile.vc,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- makefile.vc 10 Apr 2003 12:45:21 -0000 1.1 +++ makefile.vc 16 Apr 2003 16:38:28 -0000 1.2 @@ -104,7 +104,7 @@ "$(INTDIR)\TtfUtil_dll$(OBJEXT)" DLL_LINK_OBJS=\ - "$(INTDIR)\win32_dll_dll$(OBJEXT)" + BSC32_SBRS=\ "$(INTDIR)\BinTree_i$(SBREXT)"\ @@ -132,7 +132,7 @@ "$(INTDIR)\GrUtil$(SBREXT)"\ "$(INTDIR)\Platform$(SBREXT)"\ "$(INTDIR)\TtfUtil$(SBREXT)"\ - "$(INTDIR)\win32_dll$(SBREXT)" + $(OUTDIR) : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" @@ -158,7 +158,7 @@ "$(INTDIR)\BinTree_i$(OBJEXT)" "$(INTDIR)\BinTree_i$(SBREXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\BinTree_i$(OBJEXT)" $? -"$(INTDIR)\BinTree_i_dll$(OBJEXT)" "$(INTDIR)\BinTree_i$(SBREXT)" : "src/Generic/BinTree_i.cpp" +"$(INTDIR)\BinTree_i_dll$(OBJEXT)" "$(INTDIR)\BinTree_i_dll$(SBREXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\BinTree_i_dll$(OBJEXT)" $? !ELSE @@ -174,7 +174,7 @@ "$(INTDIR)\Debug$(OBJEXT)" "$(INTDIR)\Debug$(SBREXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Debug$(OBJEXT)" $? -"$(INTDIR)\Debug_dll$(OBJEXT)" "$(INTDIR)\Debug$(SBREXT)" : "src/Generic/Debug.cpp" +"$(INTDIR)\Debug_dll$(OBJEXT)" "$(INTDIR)\Debug_dll$(SBREXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Debug_dll$(OBJEXT)" $? !ELSE @@ -190,7 +190,7 @@ "$(INTDIR)\Util$(OBJEXT)" "$(INTDIR)\Util$(SBREXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Util$(OBJEXT)" $? -"$(INTDIR)\Util_dll$(OBJEXT)" "$(INTDIR)\Util$(SBREXT)" : "src/Generic/Util.cpp" +"$(INTDIR)\Util_dll$(OBJEXT)" "$(INTDIR)\Util_dll$(SBREXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Util_dll$(OBJEXT)" $? !ELSE @@ -206,7 +206,7 @@ "$(INTDIR)\UtilString$(OBJEXT)" "$(INTDIR)\UtilString$(SBREXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\UtilString$(OBJEXT)" $? -"$(INTDIR)\UtilString_dll$(OBJEXT)" "$(INTDIR)\UtilString$(SBREXT)" : "src/Generic/UtilString.cpp" +"$(INTDIR)\UtilString_dll$(OBJEXT)" "$(INTDIR)\UtilString_dll$(SBREXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\UtilString_dll$(OBJEXT)" $? !ELSE @@ -222,7 +222,7 @@ "$(INTDIR)\Vector_i$(OBJEXT)" "$(INTDIR)\Vector_i$(SBREXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Vector_i$(OBJEXT)" $? -"$(INTDIR)\Vector_i_dll$(OBJEXT)" "$(INTDIR)\Vector_i$(SBREXT)" : "src/Generic/Vector_i.cpp" +"$(INTDIR)\Vector_i_dll$(OBJEXT)" "$(INTDIR)\Vector_i_dll$(SBREXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Vector_i_dll$(OBJEXT)" $? !ELSE @@ -238,7 +238,7 @@ "$(INTDIR)\explicit_instantiations$(OBJEXT)" "$(INTDIR)\explicit_instantiations$(SBREXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\explicit_instantiations$(OBJEXT)" $? -"$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" "$(INTDIR)\explicit_instantiations$(SBREXT)" : "src/GrEngine/explicit_instantiations.cpp" +"$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" "$(INTDIR)\explicit_instantiations_dll$(SBREXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" $? !ELSE @@ -254,7 +254,7 @@ "$(INTDIR)\FileInput$(OBJEXT)" "$(INTDIR)\FileInput$(SBREXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\FileInput$(OBJEXT)" $? -"$(INTDIR)\FileInput_dll$(OBJEXT)" "$(INTDIR)\FileInput$(SBREXT)" : "src/GrEngine/FileInput.cpp" +"$(INTDIR)\FileInput_dll$(OBJEXT)" "$(INTDIR)\FileInput_dll$(SBREXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\FileInput_dll$(OBJEXT)" $? !ELSE @@ -270,7 +270,7 @@ "$(INTDIR)\GrCharStream$(OBJEXT)" "$(INTDIR)\GrCharStream$(SBREXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrCharStream$(OBJEXT)" $? -"$(INTDIR)\GrCharStream_dll$(OBJEXT)" "$(INTDIR)\GrCharStream$(SBREXT)" : "src/GrEngine/GrCharStream.cpp" +"$(INTDIR)\GrCharStream_dll$(OBJEXT)" "$(INTDIR)\GrCharStream_dll$(SBREXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrCharStream_dll$(OBJEXT)" $? !ELSE @@ -286,7 +286,7 @@ "$(INTDIR)\GrClassTable$(OBJEXT)" "$(INTDIR)\GrClassTable$(SBREXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrClassTable$(OBJEXT)" $? -"$(INTDIR)\GrClassTable_dll$(OBJEXT)" "$(INTDIR)\GrClassTable$(SBREXT)" : "src/GrEngine/GrClassTable.cpp" +"$(INTDIR)\GrClassTable_dll$(OBJEXT)" "$(INTDIR)\GrClassTable_dll$(SBREXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrClassTable_dll$(OBJEXT)" $? !ELSE @@ -302,7 +302,7 @@ "$(INTDIR)\GrEngine$(OBJEXT)" "$(INTDIR)\GrEngine$(SBREXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrEngine$(OBJEXT)" $? -"$(INTDIR)\GrEngine_dll$(OBJEXT)" "$(INTDIR)\GrEngine$(SBREXT)" : "src/GrEngine/GrEngine.cpp" +"$(INTDIR)\GrEngine_dll$(OBJEXT)" "$(INTDIR)\GrEngine_dll$(SBREXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrEngine_dll$(OBJEXT)" $? !ELSE @@ -318,7 +318,7 @@ "$(INTDIR)\GrFeature$(OBJEXT)" "$(INTDIR)\GrFeature$(SBREXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFeature$(OBJEXT)" $? -"$(INTDIR)\GrFeature_dll$(OBJEXT)" "$(INTDIR)\GrFeature$(SBREXT)" : "src/GrEngine/GrFeature.cpp" +"$(INTDIR)\GrFeature_dll$(OBJEXT)" "$(INTDIR)\GrFeature_dll$(SBREXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrFeature_dll$(OBJEXT)" $? !ELSE @@ -334,7 +334,7 @@ "$(INTDIR)\GrFSM$(OBJEXT)" "$(INTDIR)\GrFSM$(SBREXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFSM$(OBJEXT)" $? -"$(INTDIR)\GrFSM_dll$(OBJEXT)" "$(INTDIR)\GrFSM$(SBREXT)" : "src/GrEngine/GrFSM.cpp" +"$(INTDIR)\GrFSM_dll$(OBJEXT)" "$(INTDIR)\GrFSM_dll$(SBREXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrFSM_dll$(OBJEXT)" $? !ELSE @@ -350,7 +350,7 @@ "$(INTDIR)\GrGlyphTable$(OBJEXT)" "$(INTDIR)\GrGlyphTable$(SBREXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrGlyphTable$(OBJEXT)" $? -"$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" "$(INTDIR)\GrGlyphTable$(SBREXT)" : "src/GrEngine/GrGlyphTable.cpp" +"$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" "$(INTDIR)\GrGlyphTable_dll$(SBREXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" $? !ELSE @@ -366,7 +366,7 @@ "$(INTDIR)\GrPass$(OBJEXT)" "$(INTDIR)\GrPass$(SBREXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPass$(OBJEXT)" $? -"$(INTDIR)\GrPass_dll$(OBJEXT)" "$(INTDIR)\GrPass$(SBREXT)" : "src/GrEngine/GrPass.cpp" +"$(INTDIR)\GrPass_dll$(OBJEXT)" "$(INTDIR)\GrPass_dll$(SBREXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrPass_dll$(OBJEXT)" $? !ELSE @@ -382,7 +382,7 @@ "$(INTDIR)\GrPassActionCode$(OBJEXT)" "$(INTDIR)\GrPassActionCode$(SBREXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPassActionCode$(OBJEXT)" $? -"$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" "$(INTDIR)\GrPassActionCode$(SBREXT)" : "src/GrEngine/GrPassActionCode.cpp" +"$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" "$(INTDIR)\GrPassActionCode_dll$(SBREXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" $? !ELSE @@ -398,7 +398,7 @@ "$(INTDIR)\GrSegment$(OBJEXT)" "$(INTDIR)\GrSegment$(SBREXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSegment$(OBJEXT)" $? -"$(INTDIR)\GrSegment_dll$(OBJEXT)" "$(INTDIR)\GrSegment$(SBREXT)" : "src/GrEngine/GrSegment.cpp" +"$(INTDIR)\GrSegment_dll$(OBJEXT)" "$(INTDIR)\GrSegment_dll$(SBREXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSegment_dll$(OBJEXT)" $? !ELSE @@ -414,7 +414,7 @@ "$(INTDIR)\GrSlotState$(OBJEXT)" "$(INTDIR)\GrSlotState$(SBREXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotState$(OBJEXT)" $? -"$(INTDIR)\GrSlotState_dll$(OBJEXT)" "$(INTDIR)\GrSlotState$(SBREXT)" : "src/GrEngine/GrSlotState.cpp" +"$(INTDIR)\GrSlotState_dll$(OBJEXT)" "$(INTDIR)\GrSlotState_dll$(SBREXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotState_dll$(OBJEXT)" $? !ELSE @@ -430,7 +430,7 @@ "$(INTDIR)\GrSlotStream$(OBJEXT)" "$(INTDIR)\GrSlotStream$(SBREXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotStream$(OBJEXT)" $? -"$(INTDIR)\GrSlotStream_dll$(OBJEXT)" "$(INTDIR)\GrSlotStream$(SBREXT)" : "src/GrEngine/GrSlotStream.cpp" +"$(INTDIR)\GrSlotStream_dll$(OBJEXT)" "$(INTDIR)\GrSlotStream_dll$(SBREXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotStream_dll$(OBJEXT)" $? !ELSE @@ -446,7 +446,7 @@ "$(INTDIR)\GrTableManager$(OBJEXT)" "$(INTDIR)\GrTableManager$(SBREXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrTableManager$(OBJEXT)" $? -"$(INTDIR)\GrTableManager_dll$(OBJEXT)" "$(INTDIR)\GrTableManager$(SBREXT)" : "src/GrEngine/GrTableManager.cpp" +"$(INTDIR)\GrTableManager_dll$(OBJEXT)" "$(INTDIR)\GrTableManager_dll$(SBREXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrTableManager_dll$(OBJEXT)" $? !ELSE @@ -462,7 +462,7 @@ "$(INTDIR)\TestFSM$(OBJEXT)" "$(INTDIR)\TestFSM$(SBREXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestFSM$(OBJEXT)" $? -"$(INTDIR)\TestFSM_dll$(OBJEXT)" "$(INTDIR)\TestFSM$(SBREXT)" : "src/GrEngine/TestFSM.cpp" +"$(INTDIR)\TestFSM_dll$(OBJEXT)" "$(INTDIR)\TestFSM_dll$(SBREXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TestFSM_dll$(OBJEXT)" $? !ELSE @@ -478,7 +478,7 @@ "$(INTDIR)\TestPasses$(OBJEXT)" "$(INTDIR)\TestPasses$(SBREXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestPasses$(OBJEXT)" $? -"$(INTDIR)\TestPasses_dll$(OBJEXT)" "$(INTDIR)\TestPasses$(SBREXT)" : "src/GrEngine/TestPasses.cpp" +"$(INTDIR)\TestPasses_dll$(OBJEXT)" "$(INTDIR)\TestPasses_dll$(SBREXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TestPasses_dll$(OBJEXT)" $? !ELSE @@ -494,7 +494,7 @@ "$(INTDIR)\TransductionLog$(OBJEXT)" "$(INTDIR)\TransductionLog$(SBREXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TransductionLog$(OBJEXT)" $? -"$(INTDIR)\TransductionLog_dll$(OBJEXT)" "$(INTDIR)\TransductionLog$(SBREXT)" : "src/GrEngine/TransductionLog.cpp" +"$(INTDIR)\TransductionLog_dll$(OBJEXT)" "$(INTDIR)\TransductionLog_dll$(SBREXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TransductionLog_dll$(OBJEXT)" $? !ELSE @@ -510,7 +510,7 @@ "$(INTDIR)\GrUtil$(OBJEXT)" "$(INTDIR)\GrUtil$(SBREXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrUtil$(OBJEXT)" $? -"$(INTDIR)\GrUtil_dll$(OBJEXT)" "$(INTDIR)\GrUtil$(SBREXT)" : "src/lib/GrUtil.cpp" +"$(INTDIR)\GrUtil_dll$(OBJEXT)" "$(INTDIR)\GrUtil_dll$(SBREXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrUtil_dll$(OBJEXT)" $? !ELSE @@ -526,7 +526,7 @@ "$(INTDIR)\Platform$(OBJEXT)" "$(INTDIR)\Platform$(SBREXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Platform$(OBJEXT)" $? -"$(INTDIR)\Platform_dll$(OBJEXT)" "$(INTDIR)\Platform$(SBREXT)" : "src/lib/Platform.cpp" +"$(INTDIR)\Platform_dll$(OBJEXT)" "$(INTDIR)\Platform_dll$(SBREXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Platform_dll$(OBJEXT)" $? !ELSE @@ -542,7 +542,7 @@ "$(INTDIR)\TtfUtil$(OBJEXT)" "$(INTDIR)\TtfUtil$(SBREXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TtfUtil$(OBJEXT)" $? -"$(INTDIR)\TtfUtil_dll$(OBJEXT)" "$(INTDIR)\TtfUtil$(SBREXT)" : "src/TtfUtil/TtfUtil.cpp" +"$(INTDIR)\TtfUtil_dll$(OBJEXT)" "$(INTDIR)\TtfUtil_dll$(SBREXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TtfUtil_dll$(OBJEXT)" $? !ELSE @@ -551,22 +551,6 @@ "$(INTDIR)\TtfUtil_dll$(OBJEXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\TtfUtil_dll$(OBJEXT)" $? - -!ENDIF - -!IF "$(CFG)" == "debug" -"$(INTDIR)\win32_dll$(OBJEXT)" "$(INTDIR)\win32_dll$(SBREXT)" : "contrib/dll/win32_dll.cpp" - @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll$(OBJEXT)" $? - -"$(INTDIR)\win32_dll_dll$(OBJEXT)" "$(INTDIR)\win32_dll$(SBREXT)" : "contrib/dll/win32_dll.cpp" - @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll_dll$(OBJEXT)" $? - -!ELSE -"$(INTDIR)\win32_dll$(OBJEXT)" : "contrib/dll/win32_dll.cpp" - @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll$(OBJEXT)" $? - -"$(INTDIR)\win32_dll_dll$(OBJEXT)" : "contrib/dll/win32_dll.cpp" - @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\win32_dll_dll$(OBJEXT)" $? !ENDIF |
From: <sil...@li...> - 2003-04-14 22:52:04
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv17013 Modified Files: GrEngine.cpp Log Message: Use sprintf instead of itoa and use Platform_MulDiv not MulDiv Index: GrEngine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngine.cpp,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- GrEngine.cpp 14 Apr 2003 21:34:29 -0000 1.7 +++ GrEngine.cpp 14 Apr 2003 22:52:00 -0000 1.8 @@ -384,17 +384,17 @@ if (pchrp->ssv == kssvSuper) { // Superscript: offset up 40% - pchrp->dympOffset += MulDiv(pchrp->dympHeight, 4, 10); + pchrp->dympOffset += Platform_MulDiv(pchrp->dympHeight, 4, 10); // Size down 1/4 - pchrp->dympHeight -= MulDiv(pchrp->dympHeight, 1, 4); + pchrp->dympHeight -= Platform_MulDiv(pchrp->dympHeight, 1, 4); pchrp->ssv = kssvOff; // Make sure no way it can happen twice! } else if (pchrp->ssv == kssvSub) { // Subscript: offset down 40% - pchrp->dympOffset -= MulDiv(pchrp->dympHeight, 4, 10); + pchrp->dympOffset -= Platform_MulDiv(pchrp->dympHeight, 4, 10); // Size down 1/4 - pchrp->dympHeight -= MulDiv(pchrp->dympHeight, 1, 4); + pchrp->dympHeight -= Platform_MulDiv(pchrp->dympHeight, 1, 4); pchrp->ssv = kssvOff; // Make sure no way it can happen twice! } @@ -1257,7 +1257,7 @@ &nTblVersion)) { char rgch[20]; - itoa(nTblVersion, rgch, 10); + sprintf(rgch, "%d", nTblVersion); StrUni stu = L"unsupported version ("; stu += rgch; stu += ") of Graphite tables"; @@ -1468,7 +1468,7 @@ m_stuInitError = "could not load cmap"; ReturnResult(kresFail); } - + // name - need feature names later fOk = false; int cbNameTbl; @@ -1498,7 +1498,7 @@ // this could cause problems if a real Symbol writing system is used in the name table // however normally real Unicode values are used instead a Symbol writing system if (!TtfUtil::Get30EngFamilyInfo(vbName.Begin(), lnNameOff, lnNameSz)) - { + { ReturnResult(kresFail); } // test for Symbol writing system. first byte of Unicode id should be 0xF0 @@ -1583,7 +1583,7 @@ if (!fOk) { char rgch[20]; - itoa(nTblVersion, rgch, 10); + sprintf(rgch, "%d", nTblVersion); StrUni stu = L"unsupported version ("; stu += rgch; stu += ") of Graphite tables"; @@ -1763,7 +1763,7 @@ int yInch; pgg->get_YUnitsPerInch(&yInch); - m_dysOffset = MulDiv(pchrp->dympOffset, yInch, 72000); // 72000 = millipoints per inch + m_dysOffset = Platform_MulDiv(pchrp->dympOffset, yInch, 72000); // 72000 = millipoints per inch // The calling application may very well send an empty string representing an invalid // font. Fall back to something we expect they'll have. |
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv17948/src/GrEngine Modified Files: FileInput.h GrCharStream.cpp GrClassTable.cpp GrClassTable.h GrEngine.cpp GrEngineDebug.h GrFSM.cpp GrFSM.h GrGlyphTable.cpp GrPass.cpp GrPass.h GrPassActionCode.cpp GrPseudoMap.h GrSegment.cpp GrSlotState.cpp GrTableManager.cpp GrTableManager.h main.h Log Message: Synchronized with FW, 14 Apr 2003, changelist #06701 Index: FileInput.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/FileInput.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- FileInput.h 12 Feb 2003 15:35:54 -0000 1.3 +++ FileInput.h 14 Apr 2003 21:34:27 -0000 1.4 @@ -53,9 +53,10 @@ /*---------------------------------------------------------------------------------------------- A stream that reads from a file. ----------------------------------------------------------------------------------------------*/ -#ifdef GR_FW class GrFileIStream : public GrIStream + +#ifdef GR_FW #ifdef comFileIO { protected: @@ -80,9 +81,15 @@ virtual void GetPositionInFont(long * plPos); virtual void SetPositionInFont(long lPos); -}; + +#else // !GR_FW +// outside of FW, it is just a bogus, trivial class that is not used +{ #endif // GR_FW + +}; + /*---------------------------------------------------------------------------------------------- A stream that reads from a buffer rather than a file. Index: GrCharStream.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrCharStream.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrCharStream.cpp 12 Feb 2003 15:35:54 -0000 1.3 +++ GrCharStream.cpp 14 Apr 2003 21:34:28 -0000 1.4 @@ -359,7 +359,7 @@ m_fvalRunFeats.m_nStyleIndex = 0; - // The engine was initialized with features from the writing system. + // The engine was initialized with features from the old writing system. // First do the string that is in m_chrpRun, because that has any features that // are part of the string's style. Index: GrClassTable.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrClassTable.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrClassTable.cpp 11 Nov 2002 23:31:48 -0000 1.2 +++ GrClassTable.cpp 14 Apr 2003 21:34:28 -0000 1.3 @@ -38,7 +38,7 @@ /*---------------------------------------------------------------------------------------------- Fill in by reading from the file stream. ----------------------------------------------------------------------------------------------*/ -void GrClassTable::ReadFromFont(GrIStream & grstrm) +void GrClassTable::ReadFromFont(GrIStream & grstrm, int nVersion) { long lClassMapStart; grstrm.GetPositionInFont(&lClassMapStart); Index: GrClassTable.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrClassTable.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrClassTable.h 11 Nov 2002 23:56:53 -0000 1.3 +++ GrClassTable.h 14 Apr 2003 21:34:28 -0000 1.4 @@ -121,7 +121,7 @@ int NumberOfInputClasses() { return m_ccls - m_cclsLinear; } int NumberOfOutputClasses() { return m_cclsLinear; } - void ReadFromFont(GrIStream & grstrm); + void ReadFromFont(GrIStream & grstrm, int nVersion); void CreateEmpty(); int FindIndex(int icls, wchar chwGlyphID); Index: GrEngine.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngine.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- GrEngine.cpp 12 Feb 2003 15:35:55 -0000 1.6 +++ GrEngine.cpp 14 Apr 2003 21:34:29 -0000 1.7 @@ -53,7 +53,8 @@ m_dysOffset = 0; m_pCmap = NULL; - m_pCmap31 = NULL; + m_pCmap_3_1 = NULL; + m_pCmap_3_10 = NULL; m_pNameTbl = NULL; m_cbNameTbl = 0; @@ -108,7 +109,8 @@ m_pgtbl = NULL; m_prgpsd = NULL; m_pCmap = NULL; - m_pCmap31 = NULL; + m_pCmap_3_1 = NULL; + m_pCmap_3_10 = NULL; m_pNameTbl = NULL; m_stuCtrlFile.Clear(); @@ -298,7 +300,7 @@ GrResult res = SetUp(NULL); if (res == kresFail || res == kresUnexpected || res == kresFalse) { - RecordFontError(prgchwErrMsg, cchMaxErrMsg); + RecordFontLoadError(prgchwErrMsg, cchMaxErrMsg); res = kresFail; } ReturnResult(res); @@ -349,7 +351,7 @@ res = SetUp(NULL); if (res == kresFail || res == kresUnexpected || res == kresFalse) { - RecordFontError(prgchwErrMsg, cchMaxErrMsg); + RecordFontLoadError(prgchwErrMsg, cchMaxErrMsg); res = kresOk; } *pgrfsdc = m_grfsdc; @@ -518,6 +520,7 @@ bool fNeedFinalBreak = (bool)fNeedFinalBreakArg; GrResult hr = kresOk; + m_fInErrorState = false; GrSegment * pgrseg = *ppsegRet; @@ -528,7 +531,7 @@ bool fBold, fItalic; GetStyles(pgts, ichwMin, &fBold, &fItalic); - GetWritingSystemDirection(pgts, ichwMin); + GetOldWritingSystemDirection(pgts, ichwMin); // Find the end of the range to render with the current font. bool fNextIsSameWs; @@ -545,7 +548,7 @@ GrResult res = SetUp(pgg, fBold, fItalic); if (res == kresFail || res == kresUnexpected || res == kresFalse) { - RecordFontError(prgchwErrMsg, cchMaxErrMsg); + RecordFontLoadError(prgchwErrMsg, cchMaxErrMsg); res = kresOk; // invalid font } CheckHr(res); @@ -558,17 +561,36 @@ fStartLine, fEndLine); // Run the tables and get back a segment. - bool fMoreNeeded = false; - m_ptman->GetSegment(pgg, pchstrm, - fStartLine, fEndLine, - dxMaxWidth, - fNeedFinalBreak, fNextIsSameWs, (ichwFontLim < ichwLim), fWidthIsCharCount, - lbPref, lbMax, ((ichwLimBacktrack == ichwLim) ? -1 : ichwLimBacktrack), - twsh, fParaRtl, nDirDepth, - &pgrseg, pdichwLimSeg, - pdxWidth, pest, - cbPrev, pbPrevSegDat, cbNextMax, pbNextSegDat, pcbNextSegDat, - pdichwContext); + bool fMoreText = ichwFontLim < ichwLim; + int ichwCallerBtLim = ((ichwLimBacktrack == ichwLim) ? -1 : ichwLimBacktrack); + try { + m_ptman->GetSegment(pgg, pchstrm, + fStartLine, fEndLine, + dxMaxWidth, + fNeedFinalBreak, fNextIsSameWs, fMoreText, fWidthIsCharCount, + lbPref, lbMax, ichwCallerBtLim, + twsh, fParaRtl, nDirDepth, + &pgrseg, pdichwLimSeg, + pdxWidth, pest, + cbPrev, pbPrevSegDat, cbNextMax, pbNextSegDat, pcbNextSegDat, + pdichwContext); + } + catch (...) + { + // Disastrous problem in rendering. Try dumb rendering. + m_fInErrorState = true; + res = RunUsingEmpty(pgg, pchstrm, + fStartLine, fEndLine, + dxMaxWidth, + fNeedFinalBreak, fNextIsSameWs, fMoreText, + lbPref, lbMax, ichwCallerBtLim, + twsh, fParaRtl, nDirDepth, + &pgrseg, pdichwLimSeg, + pdxWidth, pest, + cbPrev, pbPrevSegDat, cbNextMax, pbNextSegDat, pcbNextSegDat, + pdichwContext); + RecordFontRunError(prgchwErrMsg, cchMaxErrMsg, res); + } delete pchstrm; @@ -618,7 +640,7 @@ /*---------------------------------------------------------------------------------------------- Record a system error indicating that the font could not be loaded properly. ----------------------------------------------------------------------------------------------*/ -void GrEngine::RecordFontError(OLECHAR * prgchwErrMsg, int cchMax) +void GrEngine::RecordFontLoadError(OLECHAR * prgchwErrMsg, int cchMax) { if (prgchwErrMsg == NULL || cchMax == 0) return; @@ -646,6 +668,30 @@ } /*---------------------------------------------------------------------------------------------- + Record a system error indicating a bad error in rendering using a supposedly valid font. +----------------------------------------------------------------------------------------------*/ +void GrEngine::RecordFontRunError(OLECHAR * prgchwErrMsg, int cchMax, GrResult res) +{ + if (prgchwErrMsg == NULL || cchMax == 0) + return; + + StrUni stuMessage = L"Error in rendering using Graphite font \""; + stuMessage += m_stuFaceName; + if (m_stuErrCtrlFile) + { + stuMessage += L"\" ("; + stuMessage += m_stuErrCtrlFile; + stuMessage += L")"; + } + else + stuMessage += L"\""; + + memset(prgchwErrMsg, 0, isizeof(OLECHAR) * cchMax); + memcpy(prgchwErrMsg, stuMessage.Chars(), + min(cchMax, stuMessage.Length()) * isizeof(OLECHAR)); +} + +/*---------------------------------------------------------------------------------------------- Initialize the font error message buffer to zero. This way we can be sure to recognize an error condition by the fact that the buffer is non-zero. ----------------------------------------------------------------------------------------------*/ @@ -655,9 +701,9 @@ } /*---------------------------------------------------------------------------------------------- - Set the overall direction of the writing system based on the text properties. + Set the overall direction of the old writing system based on the text properties. ----------------------------------------------------------------------------------------------*/ -void GrEngine::GetWritingSystemDirection(IGrTextSource * pgts, int ichwMin) +void GrEngine::GetOldWritingSystemDirection(IGrTextSource * pgts, int ichwMin) { #ifdef OLD_TEST_STUFF // for test procedures: @@ -689,7 +735,7 @@ @param pgts - contains text to render @param ichwMinFont - beginning of range to render with this font @param ichwLim - end of range to render; may be beyond this font and/or - writing system + old writing system @param pfNextIsSameWs - return whether following segment will be in the same writing system @@ -732,7 +778,7 @@ int ichwMinBogus, ichwLimBogus; pgts->GetCharProps(ichwLimRun, &chrpNext, &ichwMinBogus, &ichwLimBogus); - *pfNextIsSameWs = (chrp.enc == chrpNext.enc && chrp.ws == chrpNext.ws); + *pfNextIsSameWs = (chrp.ws == chrpNext.ws && chrp.ows == chrpNext.ows); // If the following run is the same as this run except for color and underlining, // we don't have to break here. @@ -776,7 +822,7 @@ If we actually have to set things up, use the bold/italic flags to determine which version of the tables to load. (In some cases we're willing to use whatever happens to - be loaded, for instance, when asking for the writing system direction or the + be loaded, for instance, when asking for the old writing system direction or the amount of space needed for cross-line contextualization.) ENHANCE: when the registry/font/script-tag stuff is working, use @@ -946,7 +992,8 @@ // use cmap from VwGraphics so boxes are not drawn on screen // original m_pCmap cleaned up by DestroyContents() above m_pCmap = rgbFromGfx; // pCmap; - m_pCmap31 = NULL; + m_pCmap_3_1 = NULL; + m_pCmap_3_10 = NULL; if (!TtfUtil::CheckTable(ktiCmap, m_pCmap, cbCmap)) { @@ -955,18 +1002,19 @@ goto LCache; } - // set m_pCmap31 too - this should match ReadFromControlFile() below + // set m_pCmap_3_1 too - this should match ReadFromControlFile() below // find MS Unicode cmap - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); - if (!m_pCmap31) - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); - if (!m_pCmap31) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); + m_pCmap_3_10 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 10); + if (!m_pCmap_3_1) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); + if (!m_pCmap_3_1) { m_stuInitError = "failure to load cmap subtable"; res = kresFail; goto LCache; } - if (!TtfUtil::CheckCmap31Subtable(m_pCmap31)) + if (!TtfUtil::CheckCmap31Subtable(m_pCmap_3_1)) { m_stuInitError = "invalid cmap table"; res = kresFail; @@ -1067,6 +1115,9 @@ Vector<BYTE> vbHdr, vbTableDir, vbHead, vbName; + Vector<byte> vbBogus; + int nTblVersion; + // TODO: do we need these test cases anymore? #ifdef OLD_TEST_STUFF if (m_stuCtrlFile.Right(4).EqualsCI(".ttt")) @@ -1114,15 +1165,16 @@ } // MS Unicode cmap - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); - if (!m_pCmap31) - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); - if (!m_pCmap31) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); + m_pCmap_3_10 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 10); + if (!m_pCmap_3_1) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); + if (!m_pCmap_3_1) { m_stuInitError = "could not find cmap subtable"; ReturnResult(kresFail); } - if (!TtfUtil::CheckCmap31Subtable(m_pCmap31)) + if (!TtfUtil::CheckCmap31Subtable(m_pCmap_3_1)) { m_stuInitError = "could not load cmap"; ReturnResult(kresFail); @@ -1144,13 +1196,13 @@ // find the font family name if (!TtfUtil::Get31EngFamilyInfo(vbName.Begin(), lnNameOff, lnNameSz)) { // use Name table which is Symbol encode instead - // this could cause problems if a real Symbol encoding is used in the name table - // however normally real Unicode values are used instead a Symbol encoding + // this could cause problems if a real Symbol writing system is used in the name table + // however normally real Unicode values are used instead a Symbol writing system if (!TtfUtil::Get30EngFamilyInfo(vbName.Begin(), lnNameOff, lnNameSz)) { ReturnResult(kresFail); } - // test for Symbol encoding. first byte of Unicode id should be 0xF0 + // test for Symbol writing system. first byte of Unicode id should be 0xF0 if (vbName[lnNameOff + 1] == (unsigned char)0xF0) // 1 - Unicode id is big endian ReturnResult(kresFail); } @@ -1201,6 +1253,18 @@ goto LUnexpected; } + if (!CheckTableVersions(&grstrm, vbBogus, lnSilfOff, vbBogus, lnGlocOff, vbBogus, lnFeatOff, + &nTblVersion)) + { + char rgch[20]; + itoa(nTblVersion, rgch, 10); + StrUni stu = L"unsupported version ("; + stu += rgch; + stu += ") of Graphite tables"; + m_stuInitError.Assign(stu.Chars()); + goto LUnexpected; + } + // Read the "Silf" table. int chwMaxGlyphID; ReadSilTable(grstrm, lnSilfOff, 0, &chwMaxGlyphID); @@ -1317,6 +1381,7 @@ bool fOk = false; long nTableId; + int nTblVersion; Vector<byte> vbHeadTbl, vbSilfTbl, vbFeatTbl, vbGlatTbl; // vbGlocTbl @@ -1389,15 +1454,16 @@ } // MS Unicode cmap - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); - if (!m_pCmap31) - m_pCmap31 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); - if (!m_pCmap31) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 1); + m_pCmap_3_10 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 10); + if (!m_pCmap_3_1) + m_pCmap_3_1 = TtfUtil::FindCmapSubtable(m_pCmap, 3, 0); + if (!m_pCmap_3_1) { m_stuInitError = "could not find cmap subtable"; ReturnResult(kresFail); } - if (!TtfUtil::CheckCmap31Subtable(m_pCmap31)) + if (!TtfUtil::CheckCmap31Subtable(m_pCmap_3_1)) { m_stuInitError = "could not load cmap"; ReturnResult(kresFail); @@ -1429,13 +1495,13 @@ // find the font family name if (!TtfUtil::Get31EngFamilyInfo(vbName.Begin(), lnNameOff, lnNameSz)) { // use Name table which is Symbol encode instead - // this could cause problems if a real Symbol encoding is used in the name table - // however normally real Unicode values are used instead a Symbol encoding + // this could cause problems if a real Symbol writing system is used in the name table + // however normally real Unicode values are used instead a Symbol writing system if (!TtfUtil::Get30EngFamilyInfo(vbName.Begin(), lnNameOff, lnNameSz)) { ReturnResult(kresFail); } - // test for Symbol encoding. first byte of Unicode id should be 0xF0 + // test for Symbol writing system. first byte of Unicode id should be 0xF0 if (vbName[lnNameOff + 1] == (unsigned char)0xF0) // 1 - Unicode id is big endian ReturnResult(kresFail); } @@ -1445,7 +1511,7 @@ m_stuFaceName = StrUni((wchar *)(vbName.Begin() + lnNameOff), lnNameSz / isizeof(wchar)); */ - // silf + // Silf int cbSilfTbl; fOk = false; nTableId = TtfUtil::TableIdTag(ktiSilf); @@ -1463,7 +1529,7 @@ m_stuInitError = "could not find Silf table for Graphite rendering"; goto LUnexpected; } - // feat + // Feat int cbFeatTbl; fOk = false; nTableId = TtfUtil::TableIdTag(ktiFeat); @@ -1479,7 +1545,7 @@ goto LUnexpected; } - // glat + // Glat int cbGlatTbl; fOk = false; nTableId = TtfUtil::TableIdTag(ktiGlat); @@ -1494,7 +1560,7 @@ m_stuInitError = "could not find Glat table for Graphite rendering"; goto LUnexpected; } - // gloc - append to same buffer as glat + // Gloc - append to same buffer as Glat int cbGlocTbl; fOk = false; nTableId = TtfUtil::TableIdTag(ktiGloc); @@ -1513,6 +1579,18 @@ goto LUnexpected; } + fOk = CheckTableVersions(&grstrm, vbSilfTbl, 0, vbGlatTbl, cbGlatTbl, vbFeatTbl, 0, &nTblVersion); + if (!fOk) + { + char rgch[20]; + itoa(nTblVersion, rgch, 10); + StrUni stu = L"unsupported version ("; + stu += rgch; + stu += ") of Graphite tables"; + m_stuInitError.Assign(stu.Chars()); + goto LUnexpected; + } + // Parse the "Silf" table. grstrm.OpenBuffer(vbSilfTbl.Begin(), cbSilfTbl); int chwMaxGlyphID; @@ -1545,6 +1623,58 @@ } /*---------------------------------------------------------------------------------------------- + Read the version number from the tables, and return false if any are a version this + implementation of the engine can't handle. +----------------------------------------------------------------------------------------------*/ +bool GrEngine::CheckTableVersions(GrIStream * pgrstrm, + Vector<byte> & vbSilfTbl, int lSilfStart, + Vector<byte> & vbGlatTbl, int lGlocStart, + Vector<byte> & vbFeatTbl, int lFeatStart, + int * pnVersion) +{ + int nCurrentVersion = CurrentTableVersion(); + + GrFileIStream * pgrfstrm = dynamic_cast<GrFileIStream *>(pgrstrm); + GrBufferIStream * pgrbstrm = dynamic_cast<GrBufferIStream *>(pgrstrm); + Assert(pgrfstrm || pgrbstrm); + + if (pgrbstrm) + pgrbstrm->OpenBuffer(vbSilfTbl.Begin(), isizeof(int)); // just reading one int + pgrstrm->SetPositionInFont(lSilfStart); + *pnVersion = ReadVersion(*pgrstrm); + if (pgrbstrm) + pgrbstrm->Close(); + if (*pnVersion > nCurrentVersion) + return false; + + if (pgrbstrm) + pgrbstrm->OpenBuffer(vbGlatTbl.Begin(), isizeof(int)); + pgrstrm->SetPositionInFont(lGlocStart); + *pnVersion = ReadVersion(*pgrstrm); + if (pgrbstrm) + pgrbstrm->Close(); + if (*pnVersion > nCurrentVersion) + { + Assert(false); // should match Silf table + return false; + } + + if (pgrbstrm) + pgrbstrm->OpenBuffer(vbFeatTbl.Begin(), isizeof(int)); + pgrstrm->SetPositionInFont(lFeatStart); + *pnVersion = ReadVersion(*pgrstrm); + if (pgrbstrm) + pgrbstrm->Close(); + if (*pnVersion > nCurrentVersion) + { + Assert(false); // should match Silf table + return false; + } + + return true; +} + +/*---------------------------------------------------------------------------------------------- Initialize the engine from the test file. Used for test procedures. ----------------------------------------------------------------------------------------------*/ //:Ignore @@ -1568,7 +1698,7 @@ // Read the "Gloc" and "Glat" tables. ReadGlocAndGlatTables(qstrm, nGlocOffset, nGlatOffset, chwMaxGlyphID); - // Read the "feat" table. + // Read the "Feat" table. ReadFeatTable(qstrm, nFeatOffset); // Create the slot streams. @@ -1694,7 +1824,7 @@ grstrm.SetPositionInFont(lTableStart); // version - int nVersion = grstrm.ReadIntFromFont(); + int nVersion = ReadVersion(grstrm); // number of tables unsigned short cSubTables = grstrm.ReadUShortFromFont(); @@ -1804,18 +1934,26 @@ m_prgpsd = NewObj GrPseudoMap[m_cpsd]; for (i = 0; i < m_cpsd; i++) { - wchar chwUnicode = grstrm.ReadUShortFromFont(); - m_prgpsd[i].SetUnicode(chwUnicode); + if (nVersion <= 1) + { + wchar chwUnicode = grstrm.ReadUShortFromFont(); + m_prgpsd[i].SetUnicode(chwUnicode); + } + else + { + int nUnicode = grstrm.ReadIntFromFont(); + m_prgpsd[i].SetUnicode(nUnicode); + } wchar chwPseudo = grstrm.ReadUShortFromFont(); m_prgpsd[i].SetPseudoGlyph(chwPseudo); } // class table m_pctbl = NewObj GrClassTable(); - m_pctbl->ReadFromFont(grstrm); + m_pctbl->ReadFromFont(grstrm, nVersion); // passes - m_ptman->CreateAndReadPasses(grstrm, cPasses, lSubTableStart, nPassOffsets, + m_ptman->CreateAndReadPasses(grstrm, nVersion, cPasses, lSubTableStart, nPassOffsets, ipassSub1, ipassPos1, ipassJust1, ipassReordered1); } @@ -1901,7 +2039,7 @@ } /*---------------------------------------------------------------------------------------------- - Read the contents of the "feat" table from the stream, which is on an extended + Read the contents of the "Feat" table from the stream, which is on an extended TrueType font file. ----------------------------------------------------------------------------------------------*/ void GrEngine::ReadFeatTable(GrIStream & grstrm, long lTableStart) @@ -1912,8 +2050,8 @@ grstrm.SetPositionInFont(lTableStart); - // version--ignore for now - int nVersion = grstrm.ReadIntFromFont(); + // version + int nVersion = ReadVersion(grstrm); // number of features int cfeat; @@ -1980,6 +2118,110 @@ } /*---------------------------------------------------------------------------------------------- + An error happened in running the tables. Set up temporary dummy tables, and try running + with dumb rendering. + Return kresUnexpected if even running the empty tables crashed, kresFail otherwise. +----------------------------------------------------------------------------------------------*/ +GrResult GrEngine::RunUsingEmpty(IGrGraphics * pgg, + GrCharStream * pchstrm, + bool fStartLine, bool fEndLine, + int dxMaxWidth, + bool fNeedFinalBreak, bool fNextIsSameWs, bool fMoreText, + LgLineBreak lbPref, LgLineBreak lbMax, int ichwCallerBtLim, + LgTrailingWsHandling twsh, bool fParaRtl, int nDirDepth, + GrSegment ** ppsegRet, + int * pdichwLimSeg, + int * pdxWidth, LgEndSegmentType * pest, + int cbPrev, byte * pbPrevSegDat, + int cbNextMax, byte * pbNextSegDat, int * pcbNextSegDat, + int * pdichwContext) +{ + // Save the current state of the engine. + int mXAscentSave = m_mXAscent; + int mXDescentSave = m_mXDescent; + bool fLineBreakSave = m_fLineBreak; + int cchwPreXlbContextSave = m_cchwPreXlbContext; + int cchwPostXlbContextSave = m_cchwPostXlbContext; + wchar chwPseudoAttrSave = m_chwPseudoAttr; + wchar chwBWAttrSave = m_chwBWAttr; + wchar chwDirAttrSave = m_chwDirAttr; + int cComponentsSave = m_cComponents; + int cnUserDefnSave = m_cnUserDefn; + int cnCompPerLigSave = m_cnCompPerLig; + int grfsdcSave = m_grfsdc; + wchar chwLBGlyphIDSave = m_chwLBGlyphID; + int cpsdSave = m_cpsd; + int dipsdInitSave = m_dipsdInit; + int cPsdLoopSave = m_cPsdLoop; + int ipsdStartSave = m_ipsdStart; + GrTableManager * ptmanSave = m_ptman; + GrClassTable * pctblSave = m_pctbl; + GrGlyphTable * pgtblSave = m_pgtbl; + int cfeatSave = m_cfeat; + GrResult resFontReadSave = m_resFontRead; + + GrResult res = kresFail; + + // Create dummy versions of the tables and run them. + m_pctbl = NULL; + m_pgtbl = NULL; + m_ptman = NewObj GrTableManager(this); + CreateEmpty(); + + try + { + m_ptman->GetSegment(pgg, pchstrm, + fStartLine, fEndLine, + dxMaxWidth, + fNeedFinalBreak, fNextIsSameWs, fMoreText, false, + lbPref, lbMax, ichwCallerBtLim, + twsh, fParaRtl, nDirDepth, + ppsegRet, pdichwLimSeg, + pdxWidth, pest, + cbPrev, pbPrevSegDat, cbNextMax, pbNextSegDat, pcbNextSegDat, + pdichwContext); + } + catch(...) + { + // Still didn't work. Oh, well, not much we can do. + res = kresUnexpected; + } + + if (m_ptman) + delete m_ptman; + if (m_pctbl) + delete m_pctbl; + if (m_pgtbl) + delete m_pgtbl; + + // Put everything back the way it was. + m_mXAscent = mXAscentSave; + m_mXDescent = mXDescentSave; + m_fLineBreak = fLineBreakSave; + m_cchwPreXlbContext = cchwPreXlbContextSave; + m_cchwPostXlbContext = cchwPostXlbContextSave; + m_chwPseudoAttr = chwPseudoAttrSave; + m_chwBWAttr = chwBWAttrSave; + m_chwDirAttr = chwDirAttrSave; + m_cComponents = cComponentsSave; + m_cnUserDefn = cnUserDefnSave; + m_cnCompPerLig = cnCompPerLigSave; + m_grfsdc = grfsdcSave; + m_chwLBGlyphID = chwLBGlyphIDSave; + m_cpsd = cpsdSave; + m_dipsdInit = dipsdInitSave; + m_cPsdLoop = cPsdLoopSave; + m_ipsdStart = ipsdStartSave; + m_ptman = ptmanSave; + m_pctbl = pctblSave; + m_pgtbl = pgtblSave; + m_cfeat = cfeatSave; + m_resFontRead = resFontReadSave; + + return res; +} + +/*---------------------------------------------------------------------------------------------- Return the glyph ID for the given Unicode value. ----------------------------------------------------------------------------------------------*/ wchar GrEngine::GetGlyphIDFromUnicode(int nUnicode) @@ -1995,16 +2237,19 @@ #endif // OLD_TEST_STUFF // Otherwise, get the glyph ID from the font's cmap. - if (!m_pCmap31) - return 0; - return TtfUtil::Cmap31Lookup(m_pCmap31, nUnicode); // returns 0 if nUnicode is invalid + if (m_pCmap_3_10) + return TtfUtil::Cmap310Lookup(m_pCmap_3_10, nUnicode); + else if (m_pCmap_3_1) + return TtfUtil::Cmap31Lookup(m_pCmap_3_1, nUnicode); + else + return 0; } /*---------------------------------------------------------------------------------------------- Return the pseudo-glyph corresponding to the given Unicode input, or 0 if none. ----------------------------------------------------------------------------------------------*/ -wchar GrEngine::MapToPseudo(wchar chwUnicode) +wchar GrEngine::MapToPseudo(int nUnicode) { if (m_cpsd == 0) return 0; @@ -2029,7 +2274,7 @@ if (ppsdCurr < m_prgpsd) nTest = -1; else - nTest = ppsdCurr->Unicode() - chwUnicode; + nTest = ppsdCurr->Unicode() - nUnicode; if (nTest == 0) return ppsdCurr->PseudoGlyph(); @@ -2070,8 +2315,8 @@ long lSize = -1; // The Graphite compiler stores our names in either - // the MS (platform id = 3) Unicode (encoding id = 1) table - // or the MS Symbol (encoding id = 0) table. Try MS Unicode first. + // the MS (platform id = 3) Unicode (writing system id = 1) table + // or the MS Symbol (writing system id = 0) table. Try MS Unicode first. // lOffset & lSize are in bytes. if (!TtfUtil::GetNameInfo(m_pNameTbl, 3, 1, nLangID, nNameID, lOffset, lSize)) { Index: GrEngineDebug.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrEngineDebug.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrEngineDebug.h 7 Nov 2002 13:59:51 -0000 1.2 +++ GrEngineDebug.h 14 Apr 2003 21:34:29 -0000 1.3 @@ -7,10 +7,10 @@ File: GrEngineDebug.h Responsibility: Sharon Correll Last reviewed: Not yet. + +FW version synchronized to open-source version on 12 Feb 2003. ----------------------------------------------------------------------------------------------*/ -#ifdef _MSC_VER #pragma once -#endif #ifndef GR_ENGINEDBG_INCLUDED #define GR_ENGINEDBG_INCLUDED Index: GrFSM.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrFSM.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrFSM.cpp 11 Nov 2002 23:31:48 -0000 1.2 +++ GrFSM.cpp 14 Apr 2003 21:34:29 -0000 1.3 @@ -40,7 +40,7 @@ Fill in the FSM by reading from the font stream. Assumes the stream is in the correct position. ----------------------------------------------------------------------------------------------*/ -void GrFSM::ReadFromFont(GrIStream & grstrm) +void GrFSM::ReadFromFont(GrIStream & grstrm, int nVersion) { short snTmp; @@ -122,7 +122,7 @@ Fill in the FSM's state table by reading from the font stream. Assumes the stream is in the correct position. ----------------------------------------------------------------------------------------------*/ -void GrFSM::ReadStateTableFromFont(GrIStream & grstrm) +void GrFSM::ReadStateTableFromFont(GrIStream & grstrm, int nVersion) { int cCells = ((m_crow - m_crowFinal) * m_ccol); m_prgrowTransitions = NewObj short[cCells]; Index: GrFSM.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrFSM.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrFSM.h 7 Nov 2002 13:59:51 -0000 1.2 +++ GrFSM.h 14 Apr 2003 21:34:29 -0000 1.3 @@ -121,8 +121,8 @@ delete[] m_prgrowStartStates; } - void ReadFromFont(GrIStream & grstrm); - void ReadStateTableFromFont(GrIStream & grstrm); + void ReadFromFont(GrIStream & grstrm, int nVersion); + void ReadStateTableFromFont(GrIStream & grstrm, int nVersion); int GetRuleToApply(GrTableManager *, GrPass * ppass, GrSlotStream * psstrmIn, GrSlotStream * psstrmOut); Index: GrGlyphTable.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrGlyphTable.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- GrGlyphTable.cpp 5 Nov 2002 21:29:16 -0000 1.1.1.1 +++ GrGlyphTable.cpp 14 Apr 2003 21:34:30 -0000 1.2 @@ -48,7 +48,7 @@ grstrm.SetPositionInFont(lGlocStart); // version - int nVersion = grstrm.ReadIntFromFont(); + int nVersion = GrEngine::ReadVersion(grstrm); // flags short snFlags = grstrm.ReadShortFromFont(); Index: GrPass.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPass.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrPass.cpp 12 Feb 2003 15:35:55 -0000 1.4 +++ GrPass.cpp 14 Apr 2003 21:34:30 -0000 1.5 @@ -51,6 +51,7 @@ m_prgcritRulePreModContext(NULL), m_prgibConstraintStart(NULL), m_prgibActionStart(NULL), + m_prgbPConstraintBlock(NULL), m_prgbConstraintBlock(NULL), m_prgbActionBlock(NULL), m_prgibConstraintDebug(NULL), @@ -78,6 +79,8 @@ if (m_prgibActionStart) delete[] m_prgibActionStart; + if (m_prgbPConstraintBlock) + delete[] m_prgbPConstraintBlock; if (m_prgbConstraintBlock) delete[] m_prgbConstraintBlock; if (m_prgbActionBlock) @@ -92,7 +95,7 @@ /*---------------------------------------------------------------------------------------------- Fill in the pass by reading from the font stream. ----------------------------------------------------------------------------------------------*/ -void GrPass::ReadFromFont(GrIStream & grstrm, int nOffset) +void GrPass::ReadFromFont(GrIStream & grstrm, int nVersion, int nOffset) { long lCurrPos; grstrm.GetPositionInFont(&lCurrPos); @@ -119,7 +122,11 @@ // number of rules m_crul = grstrm.ReadShortFromFont(); - // offset to constraint code, relative to start of subtable + // offset to pass constraint code, relative to start of subtable + int nPConstraintOffset = 0; + if (nVersion >= 2) + nPConstraintOffset = grstrm.ReadIntFromFont(); + // offset to rule constraint code, relative to start of subtable int nConstraintOffset = grstrm.ReadIntFromFont(); // offset to action code, relative to start of subtable int nActionOffset = grstrm.ReadIntFromFont(); @@ -128,7 +135,7 @@ m_pfsm = NewObj GrFSM(); - m_pfsm->ReadFromFont(grstrm); + m_pfsm->ReadFromFont(grstrm, nVersion); // rule sort keys m_prgchwRuleSortKeys = NewObj wchar[m_crul]; @@ -147,6 +154,15 @@ *pb = grstrm.ReadByteFromFont(); } + // constraint offset for pass-level constraints + if (nVersion >= 2) + { + // Note: pass constraints have not been fully implemented. + m_cbPassConstraint = grstrm.ReadUShortFromFont(); + } + else + m_cbPassConstraint = 0; + // constraint and action offsets for rules m_prgibConstraintStart = NewObj wchar[m_crul + 1]; pchw = m_prgibConstraintStart; @@ -163,9 +179,14 @@ } // FSM state table - m_pfsm->ReadStateTableFromFont(grstrm); + m_pfsm->ReadStateTableFromFont(grstrm, nVersion); - int cb = m_prgibConstraintStart[m_crul]; + // Constraint and action blocks + int cb = m_cbPassConstraint; + m_prgbPConstraintBlock = NewObj byte[cb]; + grstrm.ReadBlockFromFont(m_prgbPConstraintBlock, cb); + + cb = m_prgibConstraintStart[m_crul]; m_prgbConstraintBlock = NewObj byte[cb]; grstrm.ReadBlockFromFont(m_prgbConstraintBlock, cb); @@ -174,7 +195,6 @@ grstrm.ReadBlockFromFont(m_prgbActionBlock, cb); // TODO SharonC/AlanW: debuggers - } /*---------------------------------------------------------------------------------------------- @@ -410,6 +430,14 @@ // Okay, we have enough input to do the reversal, if any. + // Never reverse the final linebreak; leave it at the end. + if (islotReverseLim > 0) + { + GrSlotState * pslotLast = psstrmIn->SlotAt(islotReverseLim - 1); + if (pslotLast->IsFinalLineBreak(ptman->LBGlyphID())) + islotReverseLim--; + } + psstrmIn->SetRuleStartReadPos(); psstrmOut->SetRuleStartWritePos(); @@ -1181,8 +1209,13 @@ { Assert(islotIn < psstrmIn->ReadPos()); islotIn = min(islotIn, psstrmIn->ReadPos() - 1); - while ((islotOut = psstrmIn->ChunkInNext(islotIn)) == -1) + while (islotIn < psstrmIn->ReadPos() && + (islotOut = psstrmIn->ChunkInNext(islotIn)) == -1) + { ++islotIn; + } + if (islotIn == psstrmIn->ReadPos()) + islotOut = psstrmOut->WritePos(); } Assert(islotOut != -2); // because the chunk size must be <= than the max-chunk, @@ -1233,9 +1266,9 @@ } else { islotIn = min(islotChanged, psstrmIn->ReadPos()); - islotIn--; - islotOut; - while ((islotOut = psstrmIn->ChunkInNext(islotIn)) == -1) + islotIn = max(islotIn - 1, 0); + islotOut = 0; + while (islotIn > 0 && (islotOut = psstrmIn->ChunkInNext(islotIn)) == -1) --islotIn; } Index: GrPass.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPass.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrPass.h 7 Nov 2002 13:59:51 -0000 1.2 +++ GrPass.h 14 Apr 2003 21:34:30 -0000 1.3 @@ -60,7 +60,9 @@ kopPushIGlyphAttr, // not implemented - kopPopRet, kopRetZero, kopRetTrue + kopPopRet, kopRetZero, kopRetTrue, + + kopIAttrSet, kopIAttrAdd, kopIAttrSub }; enum StackMachineFlag { @@ -76,7 +78,7 @@ // Destructor: ~GrPass(); - void ReadFromFont(GrIStream & grstrm, int nOffset); + void ReadFromFont(GrIStream & grstrm, int nVersion, int nOffset); void InitializeWithNoRules(); void InitializeLogInfo() @@ -300,7 +302,7 @@ // what we know (from processing the previous segment) is a chunk boundary. // // In most cases (and always when this is the first segment of the - // writing system) this number is 0. + // old writing system) this number is 0. int m_cslotSkipToResync; bool m_fDidResyncSkip; @@ -313,12 +315,16 @@ // that the constraints need to be tested on byte * m_prgcritRulePreModContext; - // offsets for constraint and action code; m_crul+1 of each of these + // offset for pass-level constraints; just 1 of these + wchar m_cbPassConstraint; + // offsets for constraint and action code; m_crul+1 of each of these (the last + // indicates the total byte count) wchar * m_prgibConstraintStart; wchar * m_prgibActionStart; // blocks of constraint and action code - byte * m_prgbConstraintBlock; + byte * m_prgbPConstraintBlock; // pass-level constraints + byte * m_prgbConstraintBlock; // rule constraints byte * m_prgbActionBlock; bool m_fHasDebugStrings; @@ -555,7 +561,7 @@ protected: // Instance variables: int m_nTopDirection; // 0 for LTR, 1 for RTL -- CURRENTLY NOT USED; need to - // initialize it when we set the writing system direction + // initialize it when we set the old writing system direction #ifdef OLD_TEST_STUFF public: Index: GrPassActionCode.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPassActionCode.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrPassActionCode.cpp 30 Jan 2003 20:17:28 -0000 1.2 +++ GrPassActionCode.cpp 14 Apr 2003 21:34:31 -0000 1.3 @@ -339,6 +339,9 @@ return 0; } break; + case kopIAttrSet: + case kopIAttrAdd: + case kopIAttrSub: case kopIAttrSetSlot: slat = SlotAttrName(Uint8(*pbNext++)); // slot attribute ID nIndex = Uint8(*pbNext++); @@ -821,7 +824,7 @@ int nOldVal; - if (op == kopAttrAdd || op == kopAttrSub) + if (op == kopAttrAdd || op == kopAttrSub || op == kopIAttrAdd || op == kopIAttrSub) { // Incrementing or decrementing. @@ -857,10 +860,13 @@ return; } - if (op == kopAttrAdd) - nVal += nOldVal; + if (op == kopAttrAdd || op == kopIAttrAdd) + nVal = nOldVal + nVal; else - nVal -= nOldVal; + { + Assert(op == kopAttrSub || op == kopIAttrSub); + nVal = nOldVal - nVal; + } } GrSlotState * pslotOut = psstrmOut->RuleOutputSlot(); Index: GrPseudoMap.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrPseudoMap.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- GrPseudoMap.h 7 Nov 2002 13:59:51 -0000 1.2 +++ GrPseudoMap.h 14 Apr 2003 21:34:31 -0000 1.3 @@ -28,16 +28,16 @@ class GrPseudoMap { public: - wchar Unicode() { return m_chwUnicode; } - wchar PseudoGlyph() { return m_chwPseudo; } + unsigned int Unicode() { return m_nUnicode; } + wchar PseudoGlyph() { return m_chwPseudo; } - void SetUnicode(wchar chw) { m_chwUnicode = chw; } + void SetUnicode(int n) { m_nUnicode = n; } void SetPseudoGlyph(wchar chw) { m_chwPseudo = chw; } protected: // Instance variables: - wchar m_chwUnicode; - wchar m_chwPseudo; + unsigned int m_nUnicode; + wchar m_chwPseudo; }; #endif // !GR_PSEUDOMAP_INCLUDED Index: GrSegment.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSegment.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrSegment.cpp 30 Jan 2003 20:17:28 -0000 1.4 +++ GrSegment.cpp 14 Apr 2003 21:34:31 -0000 1.5 @@ -9,7 +9,7 @@ Last reviewed: Not yet. Description: - Implements a Graphite text segment--a range of text in one writing system, that can be + Implements a Graphite text segment--a range of text in one old writing system, that can be rendered with a single font, and that fits on a single line. -------------------------------------------------------------------------------*//*:End Ignore*/ @@ -534,7 +534,7 @@ /*---------------------------------------------------------------------------------------------- Answer whether the primary direction of the segment is right-to-left. This is based - on the direction of the writing system, except for white-space-only segments, in + on the direction of the old writing system, except for white-space-only segments, in which case it is based on the main paragraph direction. ----------------------------------------------------------------------------------------------*/ GrResult GrSegment::get_RightToLeft(int ichwBase, bool * pfResult) @@ -602,7 +602,7 @@ Change the direction of the segment. This is needed specifically for white-space-only segments, which are initially created to be in the direction of the paragraph, but then later are discovered to not be line-end after all, and need to be changed to use the - directionality of the writing system. + directionality of the old writing system. @return kresFail for segments that do not have weak directionality and therefore cannot be changed. @@ -708,19 +708,19 @@ } /*---------------------------------------------------------------------------------------------- - Get the writing system used by this segment. + Get the old writing system used by this segment. ----------------------------------------------------------------------------------------------*/ -GrResult GrSegment::get_WritingSystem(int ichwBase, int * penc, int * pws) +GrResult GrSegment::get_OldWritingSystem(int ichwBase, int * pws, int * pows) { - ChkGrOutPtr(penc); ChkGrOutPtr(pws); + ChkGrOutPtr(pows); // Get char props for first run. // LgCharRenderProps chrp; // int ichwMinBogus, ichwLimBogus; // if (ResultFailed(res = m_pgts->GetCharProps(ichwBase, &chrp, &ichwMinBogus, &ichwLimBogus))) // return WARN(res); -// *pfResult = chrp.ws; +// *pfResult = chrp.ows; Assert(false); THROW(kresNotImpl); @@ -729,7 +729,7 @@ /*---------------------------------------------------------------------------------------------- The logical range of characters covered by the segment, relative to the beginning of - the segment. These values should be exact at a writing system or string boundary, + the segment. These values should be exact at a old writing system or string boundary, but may be somewhat fuzzy at a line-break, since characters may be re-ordered across such boundaries. The renderer is free to apply any definition it likes of where a line-break occurs. This should always be the same value obtained from the @@ -763,11 +763,11 @@ /*---------------------------------------------------------------------------------------------- Changes the end-of-line status of the segment. This is used after making the last segment of a string if we want to attempt to put some more text after it (e.g., in another - writing system), or if we have reordered due to bidirectionality. + old writing system), or if we have reordered due to bidirectionality. ENHANCE: the current version handles switching back and forth when we are trying to decide whether we can put more stuff on a line. So it assumes we are at the end of - the contextual run (ie, the next batch of stuff will be in a different ws). + the contextual run (ie, the next batch of stuff will be in a different ows). This will not correctly handle the way this function could or possibly should be used for bidirectional reordering. ----------------------------------------------------------------------------------------------*/ @@ -833,7 +833,7 @@ /*---------------------------------------------------------------------------------------------- Changes the start-of-line status of the segment. This is used after making the last segment of a string if we want to attempt to put some more text after it (e.g., in another - writing system), or if we have reordered due to bidirectionality. + old writing system), or if we have reordered due to bidirectionality. ----------------------------------------------------------------------------------------------*/ GrResult GrSegment::put_StartLine(int ichwBase, IGrGraphics * pgg, bool fNewVal) { @@ -940,7 +940,7 @@ /*---------------------------------------------------------------------------------------------- Answer whether the logical and physical boundaries of the string coincide. - This method is called by the application to handle writing system boundaries, and by + This method is called by the application to handle old writing system boundaries, and by other segments in a writing-system chain to handle line-breaks. @param fBoundaryEnd - asking about the logical end boundary? @@ -1700,8 +1700,8 @@ /*---------------------------------------------------------------------------------------------- Return the rendered glyphs and their x- and y-coordinates, in the order generated by - the final positioning pass. They are always returned in left-to-right order. - Note: any of the arrays may be null. + the final positioning pass, relative to the top-left of the segment. They are always + returned in (roughly) left-to-right order. Note: any of the arrays may be null. ----------------------------------------------------------------------------------------------*/ GrResult GrSegment::GetGlyphsAndPositions(int ichwBase, IGrGraphics * pgg, RECT rsArg, RECT rdArg, int cchMax, int * pcchRet, @@ -2047,7 +2047,7 @@ pslout->SetBeforeAssoc(pslot->BeforeAssoc()); pslout->SetAfterAssoc(pslot->AfterAssoc()); if (pslot->HasComponents()) - pslot->SetComponentRefsFor(OutputSlot(islot)); + pslot->SetComponentRefsFor(OutputSlot(islot)); // also sets it for pslout, since they share the buffer if (pslot->HasClusterMembers()) { pslout->SetClusterXOffset(pslot->ClusterRootOffset() * -1); @@ -2498,7 +2498,7 @@ If more than one with same igstrm, select the one with the lowest isout. @param vigbb - list of indexes into m_prggbb - @param fRTL - writing system direction + @param fRTL - old writing system direction ----------------------------------------------------------------------------------------------*/ int GrSegment::SelectBb(Vector<int> & vigbb, bool fRTL) { @@ -4803,7 +4803,7 @@ bool fIPOnRight = (fGlyphRtl != *pfAssocPrev); // When two ligatures are horizontally equal, take vertical position into account. - // In left-to-right writing systems, moving right means moving down. + // In left-to-right old writing systems, moving right means moving down. bool fMovingDown = (fMovingRight != m_fWsRtl); // Get the coordinates for all the ligatures. Index: GrSlotState.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrSlotState.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrSlotState.cpp 2 Jan 2003 21:18:47 -0000 1.3 +++ GrSlotState.cpp 14 Apr 2003 21:34:31 -0000 1.4 @@ -353,7 +353,12 @@ if (pslot) { Assert(PassModified() >= pslot->PassModified()); - pslot->SetComponentRefsFor(pslout, -1); + // Passing slati here is definitely needed for our Arabic font: for instance when + // you type something like "mla", so the l is transformed into a temporary glyph + // before creating the ligature. However, this seems to have broken something, + // which I will probably find eventually. :-( + pslot->SetComponentRefsFor(pslout, slatiArg); + //pslot->SetComponentRefsFor(pslout, -1); } } } @@ -601,8 +606,9 @@ &m_xysGlyphX, &m_xysGlyphY, &m_xysAdvX, &m_xysAdvY); if (ResultFailed(res)) { - WARN(res); - return 0; + //WARN(res); + //return 0; + ThrowHr(WarnHr(res)); } if (0 == m_xysGlyphX && 0 == m_xysGlyphY) // should agree with test done in IsSpace() below @@ -862,7 +868,9 @@ m_xsClusterXOffset = min(m_xsClusterXOffset, pslot->m_xsClusterXOffset); if (!pslot->m_fIgnoreAdvance) { - m_xsClusterAdv = max(m_xsClusterAdv, pslot->m_xsClusterAdv); + m_xsClusterAdv = max( + m_xsClusterAdv, + pslot->m_xsClusterAdv + m_xsRootShiftX); } m_xsClusterBbLeft = min(m_xsClusterBbLeft, pslot->m_xsClusterBbLeft); m_xsClusterBbRight = max(m_xsClusterBbRight, pslot->m_xsClusterBbRight); @@ -891,8 +899,8 @@ if (IsBase()) { - // These are actually meaningless numbers, for the base, but set them to something - // reasonable. + // These two are actually meaningless numbers, for the base, but set them + // to something reasonable. m_xsOffsetX = xsShiftX; m_ysOffsetY = ysShiftY; @@ -919,6 +927,7 @@ m_ysOffsetY += pslotRoot->m_ysOffsetY; m_ysOffsetY += ysShiftY; + // Cumulative effect of shifts on this and all base nodes: m_xsRootShiftX = pslotRoot->m_xsRootShiftX + xsShiftX; m_ysRootShiftY = pslotRoot->m_ysRootShiftY + ysShiftY; } @@ -952,7 +961,8 @@ int ysBbTop = GlyphMetricLogUnits(ptman, kgmetBbTop); int ysBbBottom = GlyphMetricLogUnits(ptman, kgmetBbBottom); - // Any shifts should be ignored for the sake of calculating actual position or width. + // Any shifts should be ignored for the sake of calculating actual position or width, + // hence we subtract the cumulative effect of the shifts. m_xsClusterXOffset = m_xsOffsetX - m_xsRootShiftX; m_xsClusterAdv = m_xsOffsetX + xsAdvanceX - m_xsRootShiftX; Index: GrTableManager.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrTableManager.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrTableManager.cpp 30 Jan 2003 20:17:29 -0000 1.4 +++ GrTableManager.cpp 14 Apr 2003 21:34:32 -0000 1.5 @@ -71,7 +71,7 @@ /*---------------------------------------------------------------------------------------------- Create the passes, and them fill them in by reading from the file stream. ----------------------------------------------------------------------------------------------*/ -void GrTableManager::CreateAndReadPasses(GrIStream & grstrm, +void GrTableManager::CreateAndReadPasses(GrIStream & grstrm, int nVersion, int cpassFont, long lSubTableStart, int * rgnPassOffsets, int ipassSub1Font, int ipassPos1Font, int ipassJust1Font, byte ipassPostBidiFont) { @@ -126,7 +126,7 @@ if (ipass < ipassSub1) { m_prgppass[ipass] = new GrLineBreakPass(ipass); - m_prgppass[ipass]->ReadFromFont(grstrm, + m_prgppass[ipass]->ReadFromFont(grstrm, nVersion, lSubTableStart + rgnPassOffsets[ipassFont]); m_cpassLB++; m_ipassPos1++; @@ -134,7 +134,7 @@ else if (ipassSub1 <= ipass && ipass < ipassBidi) { m_prgppass[ipass] = new GrSubPass(ipass); - m_prgppass[ipass]->ReadFromFont(grstrm, + m_prgppass[ipass]->ReadFromFont(grstrm, nVersion, lSubTableStart + rgnPassOffsets[ipassFont]); m_ipassPos1++; } @@ -150,7 +150,7 @@ m_prgppass[ipass] = new GrPosPass(ipass); if (ipassFont < cpassFont) { - m_prgppass[ipass]->ReadFromFont(grstrm, + m_prgppass[ipass]->ReadFromFont(grstrm, nVersion, lSubTableStart + rgnPassOffsets[ipassFont]); } else @@ -274,8 +274,14 @@ // generate a small arbitrary number of glyphs.) int ipassCurr = m_cpass - 1; - while (ipassCurr < m_cpass) { +// if (!m_pgreng->InErrorState() && pchstrm->Min() == 10) +// { +// int n = max(-4, 0); +// int x = 3/n; +// } + while (ipassCurr < m_cpass) + { if (ipassCurr == 0) { int nNeedNow = vnslotNeeded[0]; @@ -349,7 +355,7 @@ *pest = kestNoMore; // else if (!m_fExceededSpace && !fNextIsSameWs && fMoreText) -// // Writing system break; may be more room on the line. But see tweak below. +// // Old writing system break; may be more room on the line. But see tweak below. // *pest = kestWsBreak; else if (m_fExceededSpace) @@ -424,7 +430,7 @@ { // If we are asking for white-space only, and we didn't use up everything in the font // range, we could possibly have gotten an initial white-space only segment - // (as opposed to a writing system break). + // (as opposed to a old writing system break). *pest = kestOkayBreak; } @@ -644,7 +650,7 @@ else if (ichwCallerBtLim > -1) fInsertLB = true; else if (*pislotPrevBreak > -1) - // no longer at the edge of the writing system or font + // no longer at the edge of the old writing system or font fInsertLB = true; else if (!fMoreText) // at final edge of total range to render @@ -1191,7 +1197,7 @@ { OutputStream(ipass)->Initialize(m_ipassPos1, true); if (cbPrev == 4) - Pass(ipass)->SetResyncSkip(0); // different writing system + Pass(ipass)->SetResyncSkip(0); // different old writing system else Pass(ipass)->SetResyncSkip(*pb++); Index: GrTableManager.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/GrTableManager.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrTableManager.h 2 Jan 2003 21:18:47 -0000 1.3 +++ GrTableManager.h 14 Apr 2003 21:34:32 -0000 1.4 @@ -56,7 +56,7 @@ ~GrTableManager(); void DestroySlotBlocks(); - void CreateAndReadPasses(GrIStream & grstrm, + void CreateAndReadPasses(GrIStream & grstrm, int nVersion, int cpassFont, long lSubTableStart, int * rgnPassOffsets, int ipassSub1Font, int ipassPos1Font, int ipassJust1Font, byte ipassPostBidiFont); Index: main.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/main.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- main.h 1 Apr 2003 09:00:43 -0000 1.3 +++ main.h 14 Apr 2003 21:34:33 -0000 1.4 @@ -20,7 +20,12 @@ //:End Ignore #define NO_EXCEPTIONS 1 + +#ifdef GR_FW +#include "common.h" +#else #include "GrCommon.h" +#endif //:>******************************************************************************************** //:> Interfaces. |
From: <sil...@li...> - 2003-04-14 21:35:03
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv17948/include Modified Files: GrData.h GrEngine.h GrSegment.h IGrGraphics.h Log Message: Synchronized with FW, 14 Apr 2003, changelist #06701 Index: GrData.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrData.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrData.h 1 Apr 2003 08:55:06 -0000 1.5 +++ GrData.h 14 Apr 2003 21:34:25 -0000 1.6 @@ -33,8 +33,8 @@ unsigned long clrFore; unsigned long clrBack; int dympOffset; - int enc; int ws; + int ows; byte fWsRtl; int nDirDepth; byte ssv; Index: GrEngine.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrEngine.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- GrEngine.h 30 Jan 2003 20:17:28 -0000 1.5 +++ GrEngine.h 14 Apr 2003 21:34:25 -0000 1.6 @@ -135,11 +135,30 @@ int ComponentIndexForGlyph(wchar chwGlyphID, int nCompID); void InitFontName(); - void RecordFontError(OLECHAR * prgchwErrMsg, int cchMaxErrMsg); + void RecordFontLoadError(OLECHAR * prgchwErrMsg, int cchMaxErrMsg); + void RecordFontRunError(OLECHAR * prgchwErrMsg, int cchMaxErrMsg, GrResult res); void ClearFontError(OLECHAR * prgchwErrMsg, int cchMaxErrMsg); - void GetWritingSystemDirection(IGrTextSource * pgts, int ichwMin); + void GetOldWritingSystemDirection(IGrTextSource * pgts, int ichwMin); GrResult SetUp(IGrGraphics * pgg, bool fBold = false, bool fItalic = false); + GrResult RunUsingEmpty(IGrGraphics * pgg, + GrCharStream * pchstrm, + bool fStartLine, bool fEndLine, + int dxMaxWidth, + bool fNeedFinalBreak, bool fNextIsSameWs, bool fMoreText, + LgLineBreak lbPref, LgLineBreak lbMax, int ichwCallerBtLim, + LgTrailingWsHandling twsh, bool fParaRtoL, int nDirDepth, + GrSegment ** ppsegRet, + int * pdichwLimSeg, + int * pdxWidth, LgEndSegmentType * pest, + int cbPrev, byte * pbPrevSegDat, + int cbNextMax, byte * pbNextSegDat, int * pcbNextSegDat, + int * pdichwContext); + bool InErrorState() + { + return m_fInErrorState; + } + StrUni FaceName() { return m_stuFaceName; @@ -240,6 +259,20 @@ virtual void NewSegment(GrSegment ** ppseg); + // The highest version of the font tables that this version of the engine supports: + int CurrentTableVersion() + { + return 2; + } + + static int ReadVersion(GrIStream & grstrm) + { + int nVersion = grstrm.ReadIntFromFont(); + if (nVersion == 0x00010000) + nVersion = 0x00000001; // kludge for silly mistake + return nVersion; + } + protected: // Member variables: long m_cref; @@ -281,10 +314,12 @@ // E_UNEXPECTED if dumb rendering // E_FAIL if dumb rendering with no cmap + bool m_fInErrorState; // true if we are handling a rendering error + int m_nFontCheckSum; // when loading a font using the GrGraphics, remember the // check sum as a unique identifer - int m_nScriptTag; // from the pertinent writing system; currently not used + int m_nScriptTag; // from the pertinent old writing system; currently not used int m_grfsdc; // supported script directions bool m_fRightToLeft; // overall writing-system direction @@ -336,9 +371,10 @@ // for Unicode to glyph ID mapping byte * m_pCmap; // hold the full cmap table - void * m_pCmap31; // point to the MS Unicode cmap subtable - // uses platform 3 encoding 1 or 0, preferably 1 + void * m_pCmap_3_1; // point to the MS Unicode cmap subtable + // uses platform 3 writing system 1 or 0, preferably 1 // use for Unicode to Glyph ID conversion + void * m_pCmap_3_10; // for feature names and maybe other strings from font later byte * m_pNameTbl; // hold full name table; use Name() method to access @@ -363,6 +399,10 @@ GrResult ReadFromGraphicsFont(IGrGraphics * pgg); void AdjustFontAndStyles(IGrGraphics * pgg, StrUni & stuFaceName, LgCharRenderProps * pchrp); + bool CheckTableVersions(GrIStream * pgrstrm, + Vector<byte> & vbSilfTbl, int lSilfStart, + Vector<byte> & vbGlatTbl, int lGlocStart, + Vector<byte> & vbFeatTbl, int lFeatStart, int * pnVersion); void ReadSilTable(GrIStream & grstrm, long lTableStart, int iSubTable, int * pchwMaxGlyphID); void ReadGlocAndGlatTables(GrIStream & grstrm, long lGlocStart, long lGlatStart, @@ -371,7 +411,7 @@ void CreateEmpty(); - wchar MapToPseudo(wchar chwUnicode); + wchar MapToPseudo(int nUnicode); //:Ignore #ifdef OLD_TEST_STUFF Index: GrSegment.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrSegment.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrSegment.h 30 Jan 2003 20:17:28 -0000 1.4 +++ GrSegment.h 14 Apr 2003 21:34:26 -0000 1.5 @@ -78,7 +78,7 @@ GrResult get_RightToLeft(int ichwBase, bool * pfResult); GrResult get_DirectionDepth(int ichwBase, int * pnDepth, bool * pfWeak); GrResult SetDirectionDepth(int ichwBase, int nNewDepth); - GrResult get_WritingSystem(int ichwBase, int * penc, int * pws); + GrResult get_OldWritingSystem(int ichwBase, int * pws, int * pows); GrResult get_Lim(int ichwBase, int * pdichw); GrResult get_LimInterest(int ichwBase, int * pdichw); @@ -289,7 +289,7 @@ GrEngine * m_qreneng; // engine that is responsible - bool m_fWsRtl; // writing system direction + bool m_fWsRtl; // old writing system direction bool m_fParaRtl; // paragraph direction LgTrailingWsHandling m_twsh; Index: IGrGraphics.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/IGrGraphics.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- IGrGraphics.h 1 Apr 2003 08:55:11 -0000 1.4 +++ IGrGraphics.h 14 Apr 2003 21:34:26 -0000 1.5 @@ -18,7 +18,10 @@ #define IGRGRAPHICS_INCLUDED #include "GrResult.h" + +#ifndef GR_FW #include "GrData.h" +#endif /*---------------------------------------------------------------------------------------------- Class: IGrGraphics |
From: <sil...@li...> - 2003-04-14 21:34:58
|
Update of /cvsroot/silgraphite/silgraphite/contrib/fwviews In directory sc8-pr-cvs1:/tmp/cvs-serv17948/contrib/fwviews Modified Files: GrGraphics.cpp Log Message: Synchronized with FW, 14 Apr 2003, changelist #06701 Index: GrGraphics.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/contrib/fwviews/GrGraphics.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrGraphics.cpp 30 Jan 2003 20:17:27 -0000 1.3 +++ GrGraphics.cpp 14 Apr 2003 21:34:23 -0000 1.4 @@ -45,6 +45,7 @@ Init(); m_hfont = NULL; m_hfontOld = NULL; + m_hfontOldMeasure = NULL; } void GrGraphics::Init() @@ -82,6 +83,7 @@ GrGraphics::~GrGraphics() { + BOOL fSuccess; if (m_hdc) { ReleaseDC(); @@ -89,13 +91,13 @@ Assert(!m_hfontOld); if (m_hfontOld) { - ::DeleteObject(m_hfontOld); + fSuccess = AfGdi::DeleteObjectFont(m_hfontOld); m_hfontOld = NULL; } Assert(!m_hfont); if (m_hfont) { - ::DeleteObject(m_hfont); + fSuccess = AfGdi::DeleteObjectFont(m_hfont); m_hfont = NULL; } @@ -900,16 +902,22 @@ // We have called SetFont at least once; the most recent font selected // is in m_hfont and is also the current one in the DC. Select the // original one back into the DC to prevent GDI memory leaks and similar problems. - HFONT hfontPrev = (HFONT) ::SelectObject(m_hdc, m_hfontOld); + HFONT hfontPrev = AfGdi::SelectObjectFont(m_hdc, m_hfontOld, AfGdi::OLD); Assert(hfontPrev == m_hfont); Assert(hfontPrev != m_hfontOld); m_hfont = 0; - ::DeleteObject(hfontPrev); + fSuccess = AfGdi::DeleteObjectFont(hfontPrev); m_hfontOld = 0; } Assert(m_hfont == 0); if (m_hfontOldMeasure) - ::SelectObject(m_hdcMeasure, m_hfontOldMeasure); + { + HFONT hfontPrev; + hfontPrev = AfGdi::SelectObjectFont(m_hdcMeasure, m_hfontOldMeasure, AfGdi::OLD); + fSuccess = AfGdi::DeleteObjectFont(hfontPrev); + Assert(fSuccess); + m_hfontOldMeasure = NULL; + } fSuccess = ::RestoreDC(m_hdc, -1); // -1 means most recently saved Assert(fSuccess); } @@ -1023,7 +1031,7 @@ NULL, NULL); // default handling of unconvertibles #endif // not unicode HFONT hfont; - hfont = CreateFontIndirect(&lf); + hfont = AfGdi::CreateFontIndirect(&lf); if (!hfont) ThrowHr(WarnHr(kresFail)); SetFont(hfont); @@ -1071,6 +1079,7 @@ Assert(fSuccess); m_hfontOld = 0; + m_hfontOldMeasure = 0; //::SetMapMode(hdc, MM_TEXT); #if 0 // old code to force it to be twips. May be useful for ActiveX control ::SetWindowExtEx(hdc, 1440, 1440, NULL); // 72*20 twips per inch @@ -1193,14 +1202,15 @@ // Set the requested font. Discard the current one, if any. void GrGraphics::SetFont(HFONT hfont) { + BOOL fSuccess; if (hfont == m_hfont) return; // Select the new font into the device context - HFONT hfontPrev = (HFONT) ::SelectObject(m_hdc, hfont); + HFONT hfontPrev = AfGdi::SelectObjectFont(m_hdc, hfont); HFONT hfontPrevM = 0; // for measure DC if (m_hdc != m_hdcMeasure) { - hfontPrevM = (HFONT) ::SelectObject(m_hdcMeasure, hfont); + hfontPrevM = AfGdi::SelectObjectFont(m_hdcMeasure, hfont); // If this is the very first font we have selected into the measure DC, we need // to remember it and restore it when done. All other fonts in the measure DC // are the same ones whose lifetime is being managed for the main DC. @@ -1217,7 +1227,7 @@ // GDI memory leak that causes weird drawing failures on W-98. Assert(m_hfont); Assert(m_hfont == hfontPrev); - ::DeleteObject(m_hfont); + fSuccess = AfGdi::DeleteObjectFont(m_hfont); } else { |
From: <sil...@li...> - 2003-04-14 21:34:41
|
Update of /cvsroot/silgraphite/silgraphite/src/TtfUtil In directory sc8-pr-cvs1:/tmp/cvs-serv17948/src/TtfUtil Modified Files: Tt.h TtSfnt.h TtfUtil.cpp TtfUtil.h Log Message: Synchronized with FW, 14 Apr 2003, changelist #06701 Index: Tt.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/TtfUtil/Tt.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- Tt.h 5 Nov 2002 21:29:24 -0000 1.1.1.1 +++ Tt.h 14 Apr 2003 21:34:33 -0000 1.2 @@ -3,7 +3,8 @@ * TT.H -- Header file TrueType font structures and declarations * * Includes Apple supplied headers, then adds definitions they forgot. - * Modifed 4/25/2000 by Alan Ward + * Modified 4/25/2000 by Alan Ward + * Modified 3/27/2003 by Alan Ward */ @@ -39,7 +40,7 @@ typedef struct { uint16 format; uint16 length; - uint16 version; + uint16 version; // 21 Mar 2002 spec shows this as language uint16 segCountX2; uint16 searchRange; uint16 entrySelector; @@ -54,6 +55,23 @@ */ } sfnt_Cmap4; +/* Add the sftn_Cmap12 structs to handle cmap format added for UCS-4 - AW */ + +typedef struct { + uint32 startCharCode; + uint32 endCharCode; + uint32 startGlyphID; +} sfnt_Cmap12Group; + +typedef struct { + uint16 format; + uint16 reserved; + uint32 length; + uint32 language; + uint32 nGroups; + sfnt_Cmap12Group groupArray[1]; /* groupArray[nGroups] */ +} sfnt_Cmap12; +#define SIZEOFCMAP12 16 // Add this typedef to parse the header for a glyf entry typedef struct{ Index: TtSfnt.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/TtfUtil/TtSfnt.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- TtSfnt.h 5 Nov 2002 21:29:24 -0000 1.1.1.1 +++ TtSfnt.h 14 Apr 2003 21:34:34 -0000 1.2 @@ -141,7 +141,7 @@ typedef struct { uint16 format; uint16 length; - uint16 version; + uint16 version; // 21 Mar 2002 spec shows this as language } sfnt_mappingTable; typedef struct { Index: TtfUtil.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/TtfUtil/TtfUtil.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- TtfUtil.cpp 11 Nov 2002 23:53:12 -0000 1.2 +++ TtfUtil.cpp 14 Apr 2003 21:34:34 -0000 1.3 @@ -383,7 +383,7 @@ /*---------------------------------------------------------------------------------------------- Get the offset and size of the font family name in English for the MS Platform with Unicode - encoding. The offset is within the pName data. The string is double byte with MSB first. + writing system. The offset is within the pName data. The string is double byte with MSB first. ----------------------------------------------------------------------------------------------*/ bool TtfUtil::Get31EngFamilyInfo(const void * pName, long & lOffset, long & lSize) { @@ -392,7 +392,7 @@ /*---------------------------------------------------------------------------------------------- Get the offset and size of the full font name in English for the MS Platform with Unicode - encoding. The offset is within the pName data. The string is double byte with MSB first. + writing system. The offset is within the pName data. The string is double byte with MSB first. ----------------------------------------------------------------------------------------------*/ bool TtfUtil::Get31EngFullFontInfo(const void * pName, long & lOffset, long & lSize) { @@ -401,7 +401,7 @@ /*---------------------------------------------------------------------------------------------- Get the offset and size of the font family name in English for the MS Platform with Symbol - encoding. The offset is within the pName data. The string is double byte with MSB first. + writing system. The offset is within the pName data. The string is double byte with MSB first. ----------------------------------------------------------------------------------------------*/ bool TtfUtil::Get30EngFamilyInfo(const void * pName, long & lOffset, long & lSize) { @@ -410,7 +410,7 @@ /*---------------------------------------------------------------------------------------------- Get the offset and size of the full font name in English for the MS Platform with Symbol - encoding. The offset is within the pName data. The string is double byte with MSB first. + writing system. The offset is within the pName data. The string is double byte with MSB first. ----------------------------------------------------------------------------------------------*/ bool TtfUtil::Get30EngFullFontInfo(const void * pName, long & lOffset, long & lSize) { @@ -663,7 +663,7 @@ { const sfnt_mappingTable * pTable = reinterpret_cast<const sfnt_mappingTable *>(pCmap31); // Bob H says ome freeware TT fonts have version 1 (eg, CALIGULA.TTF) - // so don't check subtable version + // so don't check subtable version. 21 Mar 2002 spec changes version to language. if (// swapw(pTable->version) == 0 && swapw(pTable->format) == 4) return true; @@ -675,7 +675,6 @@ Return the Glyph ID for the given Unicode ID in the Microsoft Unicode subtable. (Actually this code only depends on subtable being format 4.) Return 0 if the Unicode ID is not in the subtable. - This is the source of Glyph IDs used through out the rest of this code. ----------------------------------------------------------------------------------------------*/ int TtfUtil::Cmap31Lookup(const void * pCmap31, int nUnicodeId) { @@ -722,13 +721,52 @@ uint16 idRangeOffset = swapw(*(pMid += nSeg)); if (idRangeOffset == 0) - return idDelta + nUnicodeId; + return (uint16)(idDelta + nUnicodeId); // must use modulus 2^16 // Look up value in glyphIdArray int nGlyphId = swapw(*(pMid + (nUnicodeId - chStart) + (idRangeOffset >> 1))); // If this value is 0, return 0. Else add the idDelta return nGlyphId ? nGlyphId + idDelta : 0; } + + return 0; +} + +/*---------------------------------------------------------------------------------------------- + Check the Microsoft UCS-4 subtable for expected values +----------------------------------------------------------------------------------------------*/ +bool TtfUtil::CheckCmap310Subtable(const void *pCmap310) +{ + const sfnt_mappingTable * pTable = reinterpret_cast<const sfnt_mappingTable *>(pCmap310); + if (swapw(pTable->format) == 12) + return true; + + return false; +} + +/*---------------------------------------------------------------------------------------------- + Return the Glyph ID for the given Unicode ID in the Microsoft UCS-4 subtable. + (Actually this code only depends on subtable being format 12.) + Return 0 if the Unicode ID is not in the subtable. +----------------------------------------------------------------------------------------------*/ +int TtfUtil::Cmap310Lookup(const void * pCmap310, unsigned int uUnicodeId) +{ + const sfnt_Cmap12 * pTable = reinterpret_cast<const sfnt_Cmap12 *>(pCmap310); + + uint32 uLength = swapl(pTable->length); //could use to test for premature end of table + uint32 ucGroups = swapl(pTable->nGroups); + + for (unsigned int i = 0; i < ucGroups; i++) + { + uint32 uStartCode = swapl(pTable->groupArray[i].startCharCode); + uint32 uEndCode = swapl(pTable->groupArray[i].endCharCode); + if (uUnicodeId >= uStartCode && uUnicodeId <= uEndCode) + { + uint32 uDiff = uUnicodeId - uStartCode; + uint32 uStartGid = swapl(pTable->groupArray[i].startGlyphID); + return uStartGid + uDiff; + } + } return 0; } Index: TtfUtil.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/TtfUtil/TtfUtil.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- TtfUtil.h 11 Nov 2002 23:57:29 -0000 1.2 +++ TtfUtil.h 14 Apr 2003 21:34:34 -0000 1.3 @@ -72,6 +72,8 @@ int nEncodingId = 1); static bool CheckCmap31Subtable(const void * pCmap31); static int Cmap31Lookup(const void * pCmap31, int nUnicodeId); + static bool CheckCmap310Subtable(const void *pCmap310); + static int Cmap310Lookup(const void * pCmap310, unsigned int uUnicodeId); ///////////////////////////////// horizontal metric data for a glyph static bool HorMetrics(int nGlyphId, const void * pHmtx, long lHmtxSize, |
From: <sil...@li...> - 2003-04-14 21:34:38
|
Update of /cvsroot/silgraphite/silgraphite/src/lib In directory sc8-pr-cvs1:/tmp/cvs-serv17948/src/lib Modified Files: GrUtil.cpp Log Message: Synchronized with FW, 14 Apr 2003, changelist #06701 Index: GrUtil.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/GrUtil.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrUtil.cpp 1 Apr 2003 22:23:38 -0000 1.4 +++ GrUtil.cpp 14 Apr 2003 21:34:34 -0000 1.5 @@ -26,9 +26,14 @@ #include <windows.h> #endif // _WIN32 +#ifdef GR_FW +#include debug.h +#else +#include "GrDebug.h" +#endif + #include <stdio.h> #include "GrUtil.h" -#include "GrDebug.h" #include "UtilRegistry.h" typedef enum |
From: <sil...@li...> - 2003-04-10 12:45:28
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1:/tmp/cvs-serv18352 Added Files: makefile.vc Removed Files: makefile Log Message: rename the msvc makefile to makefile.vc to stop it interfering with autotool builds --- NEW FILE: makefile.vc --- TARGET=grengine CPP=cl.exe # CPPFLAGS=/nologo /W3 /GX /I "./src/lib" /I "./src/generic" /I "./src/ttfutil" /I "./src/grengine" /I "./include" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\grengine.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c CPPFLAGS=/nologo /W3 /GX /I "./src/lib" /I "./src/generic" /I "./src/ttfutil" /I "./src/grengine" /I "./include" /D "WIN32" /D "_WINDOWS" /Fp"$(INTDIR)\grengine.pch" /YX /Fd"$(INTDIR)\\" /FD /c link=link.exe LINK_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib MSVCRTD.LIB /nologo /dll /pdb:"$(OUTDIR)\\grengine.pdb" /machine:I386 /out:"$(OUTDIR)\\$(TARGET).dll" /implib:"$(OUTDIR)\\$(TARGET).lib" BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\\$(TARGET).bsc" AR=lib AR_FLAGS=/OUT:$@ OBJEXT = .obj SBREXT = .sbr !IF "$(CFG)" == "debug" CPP_DEBUG=/D "DEBUG" /Gm /GR /ZI /Od /GZ /FR"$(INTDIR)\\" /MTd OUTDIR=.\debug INTDIR=.\debug_temp LINK_DEBUG=/debug /incremental:yes /pdbtype:sept all : lib lib_dll bsc !ELSE CPP_DEBUG=/D "NDEBUG" /O2 /MT OUTDIR=.\release INTDIR=.\release_temp LINK_DEBUG=/incremental:no all : lib lib_dll !ENDIF !IF "$(OS)" == "Windows_NT" NULL= !ELSE NULL=nul !ENDIF clean : @- rd /s/q .\release_temp @- rd /s/q .\debug_temp realclean : clean @- rd /s/q .\release @- rd /s/q .\debug LINK_OBJS=\ "$(INTDIR)\BinTree_i$(OBJEXT)"\ "$(INTDIR)\Debug$(OBJEXT)"\ "$(INTDIR)\Util$(OBJEXT)"\ "$(INTDIR)\UtilString$(OBJEXT)"\ "$(INTDIR)\Vector_i$(OBJEXT)"\ "$(INTDIR)\explicit_instantiations$(OBJEXT)"\ "$(INTDIR)\FileInput$(OBJEXT)"\ "$(INTDIR)\GrCharStream$(OBJEXT)"\ "$(INTDIR)\GrClassTable$(OBJEXT)"\ "$(INTDIR)\GrEngine$(OBJEXT)"\ "$(INTDIR)\GrFeature$(OBJEXT)"\ "$(INTDIR)\GrFSM$(OBJEXT)"\ "$(INTDIR)\GrGlyphTable$(OBJEXT)"\ "$(INTDIR)\GrPass$(OBJEXT)"\ "$(INTDIR)\GrPassActionCode$(OBJEXT)"\ "$(INTDIR)\GrSegment$(OBJEXT)"\ "$(INTDIR)\GrSlotState$(OBJEXT)"\ "$(INTDIR)\GrSlotStream$(OBJEXT)"\ "$(INTDIR)\GrTableManager$(OBJEXT)"\ "$(INTDIR)\TestFSM$(OBJEXT)"\ "$(INTDIR)\TestPasses$(OBJEXT)"\ "$(INTDIR)\TransductionLog$(OBJEXT)"\ "$(INTDIR)\GrUtil$(OBJEXT)"\ "$(INTDIR)\Platform$(OBJEXT)"\ "$(INTDIR)\TtfUtil$(OBJEXT)" LINK_DLL_OBJS=\ "$(INTDIR)\BinTree_i_dll$(OBJEXT)"\ "$(INTDIR)\Debug_dll$(OBJEXT)"\ "$(INTDIR)\Util_dll$(OBJEXT)"\ "$(INTDIR)\UtilString_dll$(OBJEXT)"\ "$(INTDIR)\Vector_i_dll$(OBJEXT)"\ "$(INTDIR)\explicit_instantiations_dll$(OBJEXT)"\ "$(INTDIR)\FileInput_dll$(OBJEXT)"\ "$(INTDIR)\GrCharStream_dll$(OBJEXT)"\ "$(INTDIR)\GrClassTable_dll$(OBJEXT)"\ "$(INTDIR)\GrEngine_dll$(OBJEXT)"\ "$(INTDIR)\GrFeature_dll$(OBJEXT)"\ "$(INTDIR)\GrFSM_dll$(OBJEXT)"\ "$(INTDIR)\GrGlyphTable_dll$(OBJEXT)"\ "$(INTDIR)\GrPass_dll$(OBJEXT)"\ "$(INTDIR)\GrPassActionCode_dll$(OBJEXT)"\ "$(INTDIR)\GrSegment_dll$(OBJEXT)"\ "$(INTDIR)\GrSlotState_dll$(OBJEXT)"\ "$(INTDIR)\GrSlotStream_dll$(OBJEXT)"\ "$(INTDIR)\GrTableManager_dll$(OBJEXT)"\ "$(INTDIR)\TestFSM_dll$(OBJEXT)"\ "$(INTDIR)\TestPasses_dll$(OBJEXT)"\ "$(INTDIR)\TransductionLog_dll$(OBJEXT)"\ "$(INTDIR)\GrUtil_dll$(OBJEXT)"\ "$(INTDIR)\Platform_dll$(OBJEXT)"\ "$(INTDIR)\TtfUtil_dll$(OBJEXT)" DLL_LINK_OBJS=\ "$(INTDIR)\win32_dll_dll$(OBJEXT)" BSC32_SBRS=\ "$(INTDIR)\BinTree_i$(SBREXT)"\ "$(INTDIR)\Debug$(SBREXT)"\ "$(INTDIR)\Util$(SBREXT)"\ "$(INTDIR)\UtilString$(SBREXT)"\ "$(INTDIR)\Vector_i$(SBREXT)"\ "$(INTDIR)\explicit_instantiations$(SBREXT)"\ "$(INTDIR)\FileInput$(SBREXT)"\ "$(INTDIR)\GrCharStream$(SBREXT)"\ "$(INTDIR)\GrClassTable$(SBREXT)"\ "$(INTDIR)\GrEngine$(SBREXT)"\ "$(INTDIR)\GrFeature$(SBREXT)"\ "$(INTDIR)\GrFSM$(SBREXT)"\ "$(INTDIR)\GrGlyphTable$(SBREXT)"\ "$(INTDIR)\GrPass$(SBREXT)"\ "$(INTDIR)\GrPassActionCode$(SBREXT)"\ "$(INTDIR)\GrSegment$(SBREXT)"\ "$(INTDIR)\GrSlotState$(SBREXT)"\ "$(INTDIR)\GrSlotStream$(SBREXT)"\ "$(INTDIR)\GrTableManager$(SBREXT)"\ "$(INTDIR)\TestFSM$(SBREXT)"\ "$(INTDIR)\TestPasses$(SBREXT)"\ "$(INTDIR)\TransductionLog$(SBREXT)"\ "$(INTDIR)\GrUtil$(SBREXT)"\ "$(INTDIR)\Platform$(SBREXT)"\ "$(INTDIR)\TtfUtil$(SBREXT)"\ "$(INTDIR)\win32_dll$(SBREXT)" $(OUTDIR) : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" $(INTDIR) : if not exist "$(INTDIR)/$(NULL)" mkdir "$(INTDIR)" lib : "$(OUTDIR)/$(TARGET).lib" lib_dll : "$(OUTDIR)/$(TARGET)_dll.lib" "$(OUTDIR)/$(TARGET).lib" : "$(OUTDIR)" "$(INTDIR)" $(LINK_OBJS) $(AR) @<< $(AR_FLAGS) $(LINK_OBJS) << "$(OUTDIR)/$(TARGET)_dll.lib" : "$(OUTDIR)" "$(INTDIR)" $(LINK_DLL_OBJS) $(AR) @<< $(AR_FLAGS) $(LINK_DLL_OBJS) << !IF "$(CFG)" == "debug" "$(INTDIR)\BinTree_i$(OBJEXT)" "$(INTDIR)\BinTree_i$(SBREXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\BinTree_i$(OBJEXT)" $? "$(INTDIR)\BinTree_i_dll$(OBJEXT)" "$(INTDIR)\BinTree_i$(SBREXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\BinTree_i_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\BinTree_i$(OBJEXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\BinTree_i$(OBJEXT)" $? "$(INTDIR)\BinTree_i_dll$(OBJEXT)" : "src/Generic/BinTree_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\BinTree_i_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\Debug$(OBJEXT)" "$(INTDIR)\Debug$(SBREXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Debug$(OBJEXT)" $? "$(INTDIR)\Debug_dll$(OBJEXT)" "$(INTDIR)\Debug$(SBREXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Debug_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\Debug$(OBJEXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Debug$(OBJEXT)" $? "$(INTDIR)\Debug_dll$(OBJEXT)" : "src/Generic/Debug.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\Debug_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\Util$(OBJEXT)" "$(INTDIR)\Util$(SBREXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Util$(OBJEXT)" $? "$(INTDIR)\Util_dll$(OBJEXT)" "$(INTDIR)\Util$(SBREXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Util_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\Util$(OBJEXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Util$(OBJEXT)" $? "$(INTDIR)\Util_dll$(OBJEXT)" : "src/Generic/Util.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\Util_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\UtilString$(OBJEXT)" "$(INTDIR)\UtilString$(SBREXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\UtilString$(OBJEXT)" $? "$(INTDIR)\UtilString_dll$(OBJEXT)" "$(INTDIR)\UtilString$(SBREXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\UtilString_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\UtilString$(OBJEXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\UtilString$(OBJEXT)" $? "$(INTDIR)\UtilString_dll$(OBJEXT)" : "src/Generic/UtilString.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\UtilString_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\Vector_i$(OBJEXT)" "$(INTDIR)\Vector_i$(SBREXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Vector_i$(OBJEXT)" $? "$(INTDIR)\Vector_i_dll$(OBJEXT)" "$(INTDIR)\Vector_i$(SBREXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Vector_i_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\Vector_i$(OBJEXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Vector_i$(OBJEXT)" $? "$(INTDIR)\Vector_i_dll$(OBJEXT)" : "src/Generic/Vector_i.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\Vector_i_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\explicit_instantiations$(OBJEXT)" "$(INTDIR)\explicit_instantiations$(SBREXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\explicit_instantiations$(OBJEXT)" $? "$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" "$(INTDIR)\explicit_instantiations$(SBREXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\explicit_instantiations$(OBJEXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\explicit_instantiations$(OBJEXT)" $? "$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" : "src/GrEngine/explicit_instantiations.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\explicit_instantiations_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\FileInput$(OBJEXT)" "$(INTDIR)\FileInput$(SBREXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\FileInput$(OBJEXT)" $? "$(INTDIR)\FileInput_dll$(OBJEXT)" "$(INTDIR)\FileInput$(SBREXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\FileInput_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\FileInput$(OBJEXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\FileInput$(OBJEXT)" $? "$(INTDIR)\FileInput_dll$(OBJEXT)" : "src/GrEngine/FileInput.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\FileInput_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrCharStream$(OBJEXT)" "$(INTDIR)\GrCharStream$(SBREXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrCharStream$(OBJEXT)" $? "$(INTDIR)\GrCharStream_dll$(OBJEXT)" "$(INTDIR)\GrCharStream$(SBREXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrCharStream_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrCharStream$(OBJEXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrCharStream$(OBJEXT)" $? "$(INTDIR)\GrCharStream_dll$(OBJEXT)" : "src/GrEngine/GrCharStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrCharStream_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrClassTable$(OBJEXT)" "$(INTDIR)\GrClassTable$(SBREXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrClassTable$(OBJEXT)" $? "$(INTDIR)\GrClassTable_dll$(OBJEXT)" "$(INTDIR)\GrClassTable$(SBREXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrClassTable_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrClassTable$(OBJEXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrClassTable$(OBJEXT)" $? "$(INTDIR)\GrClassTable_dll$(OBJEXT)" : "src/GrEngine/GrClassTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrClassTable_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrEngine$(OBJEXT)" "$(INTDIR)\GrEngine$(SBREXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrEngine$(OBJEXT)" $? "$(INTDIR)\GrEngine_dll$(OBJEXT)" "$(INTDIR)\GrEngine$(SBREXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrEngine_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrEngine$(OBJEXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrEngine$(OBJEXT)" $? "$(INTDIR)\GrEngine_dll$(OBJEXT)" : "src/GrEngine/GrEngine.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrEngine_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrFeature$(OBJEXT)" "$(INTDIR)\GrFeature$(SBREXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFeature$(OBJEXT)" $? "$(INTDIR)\GrFeature_dll$(OBJEXT)" "$(INTDIR)\GrFeature$(SBREXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrFeature_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrFeature$(OBJEXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFeature$(OBJEXT)" $? "$(INTDIR)\GrFeature_dll$(OBJEXT)" : "src/GrEngine/GrFeature.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrFeature_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrFSM$(OBJEXT)" "$(INTDIR)\GrFSM$(SBREXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFSM$(OBJEXT)" $? "$(INTDIR)\GrFSM_dll$(OBJEXT)" "$(INTDIR)\GrFSM$(SBREXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrFSM_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrFSM$(OBJEXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrFSM$(OBJEXT)" $? "$(INTDIR)\GrFSM_dll$(OBJEXT)" : "src/GrEngine/GrFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrFSM_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrGlyphTable$(OBJEXT)" "$(INTDIR)\GrGlyphTable$(SBREXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrGlyphTable$(OBJEXT)" $? "$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" "$(INTDIR)\GrGlyphTable$(SBREXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrGlyphTable$(OBJEXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrGlyphTable$(OBJEXT)" $? "$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" : "src/GrEngine/GrGlyphTable.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrGlyphTable_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrPass$(OBJEXT)" "$(INTDIR)\GrPass$(SBREXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPass$(OBJEXT)" $? "$(INTDIR)\GrPass_dll$(OBJEXT)" "$(INTDIR)\GrPass$(SBREXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrPass_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrPass$(OBJEXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPass$(OBJEXT)" $? "$(INTDIR)\GrPass_dll$(OBJEXT)" : "src/GrEngine/GrPass.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrPass_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrPassActionCode$(OBJEXT)" "$(INTDIR)\GrPassActionCode$(SBREXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPassActionCode$(OBJEXT)" $? "$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" "$(INTDIR)\GrPassActionCode$(SBREXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrPassActionCode$(OBJEXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrPassActionCode$(OBJEXT)" $? "$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" : "src/GrEngine/GrPassActionCode.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrPassActionCode_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrSegment$(OBJEXT)" "$(INTDIR)\GrSegment$(SBREXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSegment$(OBJEXT)" $? "$(INTDIR)\GrSegment_dll$(OBJEXT)" "$(INTDIR)\GrSegment$(SBREXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSegment_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrSegment$(OBJEXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSegment$(OBJEXT)" $? "$(INTDIR)\GrSegment_dll$(OBJEXT)" : "src/GrEngine/GrSegment.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrSegment_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrSlotState$(OBJEXT)" "$(INTDIR)\GrSlotState$(SBREXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotState$(OBJEXT)" $? "$(INTDIR)\GrSlotState_dll$(OBJEXT)" "$(INTDIR)\GrSlotState$(SBREXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotState_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrSlotState$(OBJEXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotState$(OBJEXT)" $? "$(INTDIR)\GrSlotState_dll$(OBJEXT)" : "src/GrEngine/GrSlotState.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrSlotState_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrSlotStream$(OBJEXT)" "$(INTDIR)\GrSlotStream$(SBREXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotStream$(OBJEXT)" $? "$(INTDIR)\GrSlotStream_dll$(OBJEXT)" "$(INTDIR)\GrSlotStream$(SBREXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotStream_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrSlotStream$(OBJEXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrSlotStream$(OBJEXT)" $? "$(INTDIR)\GrSlotStream_dll$(OBJEXT)" : "src/GrEngine/GrSlotStream.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrSlotStream_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrTableManager$(OBJEXT)" "$(INTDIR)\GrTableManager$(SBREXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrTableManager$(OBJEXT)" $? "$(INTDIR)\GrTableManager_dll$(OBJEXT)" "$(INTDIR)\GrTableManager$(SBREXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrTableManager_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrTableManager$(OBJEXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrTableManager$(OBJEXT)" $? "$(INTDIR)\GrTableManager_dll$(OBJEXT)" : "src/GrEngine/GrTableManager.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrTableManager_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\TestFSM$(OBJEXT)" "$(INTDIR)\TestFSM$(SBREXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestFSM$(OBJEXT)" $? "$(INTDIR)\TestFSM_dll$(OBJEXT)" "$(INTDIR)\TestFSM$(SBREXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TestFSM_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\TestFSM$(OBJEXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestFSM$(OBJEXT)" $? "$(INTDIR)\TestFSM_dll$(OBJEXT)" : "src/GrEngine/TestFSM.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\TestFSM_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\TestPasses$(OBJEXT)" "$(INTDIR)\TestPasses$(SBREXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestPasses$(OBJEXT)" $? "$(INTDIR)\TestPasses_dll$(OBJEXT)" "$(INTDIR)\TestPasses$(SBREXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TestPasses_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\TestPasses$(OBJEXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TestPasses$(OBJEXT)" $? "$(INTDIR)\TestPasses_dll$(OBJEXT)" : "src/GrEngine/TestPasses.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\TestPasses_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\TransductionLog$(OBJEXT)" "$(INTDIR)\TransductionLog$(SBREXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TransductionLog$(OBJEXT)" $? "$(INTDIR)\TransductionLog_dll$(OBJEXT)" "$(INTDIR)\TransductionLog$(SBREXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TransductionLog_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\TransductionLog$(OBJEXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TransductionLog$(OBJEXT)" $? "$(INTDIR)\TransductionLog_dll$(OBJEXT)" : "src/GrEngine/TransductionLog.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\TransductionLog_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\GrUtil$(OBJEXT)" "$(INTDIR)\GrUtil$(SBREXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrUtil$(OBJEXT)" $? "$(INTDIR)\GrUtil_dll$(OBJEXT)" "$(INTDIR)\GrUtil$(SBREXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\GrUtil_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\GrUtil$(OBJEXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\GrUtil$(OBJEXT)" $? "$(INTDIR)\GrUtil_dll$(OBJEXT)" : "src/lib/GrUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\GrUtil_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\Platform$(OBJEXT)" "$(INTDIR)\Platform$(SBREXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Platform$(OBJEXT)" $? "$(INTDIR)\Platform_dll$(OBJEXT)" "$(INTDIR)\Platform$(SBREXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\Platform_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\Platform$(OBJEXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\Platform$(OBJEXT)" $? "$(INTDIR)\Platform_dll$(OBJEXT)" : "src/lib/Platform.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\Platform_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\TtfUtil$(OBJEXT)" "$(INTDIR)\TtfUtil$(SBREXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TtfUtil$(OBJEXT)" $? "$(INTDIR)\TtfUtil_dll$(OBJEXT)" "$(INTDIR)\TtfUtil$(SBREXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\TtfUtil_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\TtfUtil$(OBJEXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\TtfUtil$(OBJEXT)" $? "$(INTDIR)\TtfUtil_dll$(OBJEXT)" : "src/TtfUtil/TtfUtil.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\TtfUtil_dll$(OBJEXT)" $? !ENDIF !IF "$(CFG)" == "debug" "$(INTDIR)\win32_dll$(OBJEXT)" "$(INTDIR)\win32_dll$(SBREXT)" : "contrib/dll/win32_dll.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll$(OBJEXT)" $? "$(INTDIR)\win32_dll_dll$(OBJEXT)" "$(INTDIR)\win32_dll$(SBREXT)" : "contrib/dll/win32_dll.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll_dll$(OBJEXT)" $? !ELSE "$(INTDIR)\win32_dll$(OBJEXT)" : "contrib/dll/win32_dll.cpp" @- $(CPP) $(CPPFLAGS) $(CPP_DEBUG) /Fo"$(INTDIR)\win32_dll$(OBJEXT)" $? "$(INTDIR)\win32_dll_dll$(OBJEXT)" : "contrib/dll/win32_dll.cpp" @- $(CPP) $(CPPFLAGS) /D "_DLL" /Fo"$(INTDIR)\win32_dll_dll$(OBJEXT)" $? !ENDIF bsc : "$(OUTDIR)/$(TARGET).bsc" "$(OUTDIR)/$(TARGET).bsc" : "$(OUTDIR)" $(BSC32_SBRS) $(BSC32) @<< $(BSC32_FLAGS) $(BSC32_SBRS) << dll : $(OUTDIR)/$(TARGET).dll "$(OUTDIR)/$(TARGET).dll" : "$(OUTDIR)" $(DEF_FILE) lib_dll $(DLL_LINK_OBJS) $(LINK) $(LINK_FLAGS) $(LINK_DEBUG) $(OUTDIR)/$(TARGET)_dll.lib $(DLL_LINK_OBJS) --- makefile DELETED --- |
From: <sil...@li...> - 2003-04-01 22:24:13
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv29891/include Modified Files: GrCommon.h Log Message: include GrDebug not debug Index: GrCommon.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrCommon.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- GrCommon.h 1 Apr 2003 08:55:04 -0000 1.1 +++ GrCommon.h 1 Apr 2003 22:23:36 -0000 1.2 @@ -20,7 +20,7 @@ #ifndef Common_H #define Common_H 1 -#include "platform.h" +#include "GrPlatform.h" /*********************************************************************************************** Set the ENTER_DLL macro appropriately. This should be called at all potential DLL @@ -92,7 +92,7 @@ /*********************************************************************************************** Debug related definitions. ***********************************************************************************************/ -#include "debug.h" +#include "GrDebug.h" /*********************************************************************************************** Turn off the goofy warnings. |
From: <sil...@li...> - 2003-04-01 22:23:43
|
Update of /cvsroot/silgraphite/silgraphite/src/lib In directory sc8-pr-cvs1:/tmp/cvs-serv29891/src/lib Modified Files: GrUtil.cpp Log Message: include GrDebug not debug Index: GrUtil.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/GrUtil.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- GrUtil.cpp 2 Jan 2003 21:18:49 -0000 1.3 +++ GrUtil.cpp 1 Apr 2003 22:23:38 -0000 1.4 @@ -28,7 +28,7 @@ #include <stdio.h> #include "GrUtil.h" -#include "debug.h" +#include "GrDebug.h" #include "UtilRegistry.h" typedef enum |
From: <sil...@li...> - 2003-04-01 22:23:41
|
Update of /cvsroot/silgraphite/silgraphite/lib In directory sc8-pr-cvs1:/tmp/cvs-serv29891/lib Modified Files: silgraphite.dsp Log Message: include GrDebug not debug Index: silgraphite.dsp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/lib/silgraphite.dsp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- silgraphite.dsp 6 Mar 2003 19:51:33 -0000 1.1 +++ silgraphite.dsp 1 Apr 2003 22:23:37 -0000 1.2 @@ -187,6 +187,186 @@ # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=..\include\BinTree.h +# End Source File +# Begin Source File + +SOURCE=..\include\common.h +# End Source File +# Begin Source File + +SOURCE=..\include\constants.h +# End Source File +# Begin Source File + +SOURCE=..\include\debug.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\FileInput.h +# End Source File +# Begin Source File + +SOURCE=..\include\GenericResource.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrCharStream.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrClassTable.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrClient.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrData.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrEngine.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrEngineDebug.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrFeature.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrFeatureValues.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrFSM.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrGlyphTable.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrPass.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrPseudoMap.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrResult.h +# End Source File +# Begin Source File + +SOURCE=..\include\GrSegment.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrSegmentDebug.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrSlotState.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrSlotStream.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\GrTableManager.h +# End Source File +# Begin Source File + +SOURCE=..\src\lib\GrUtil.h +# End Source File +# Begin Source File + +SOURCE=..\include\IGrGraphics.h +# End Source File +# Begin Source File + +SOURCE=..\include\IGrGraphicsDrawing.h +# End Source File +# Begin Source File + +SOURCE=..\include\IGrGraphicsFont.h +# End Source File +# Begin Source File + +SOURCE=..\include\IGrTextSource.h +# End Source File +# Begin Source File + +SOURCE=..\include\LinkedList.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\main.h +# End Source File +# Begin Source File + +SOURCE=..\include\mstypes.h +# End Source File +# Begin Source File + +SOURCE=..\include\platform.h +# End Source File +# Begin Source File + +SOURCE=..\src\GrEngine\resource.h +# End Source File +# Begin Source File + +SOURCE=..\include\Throwable.h +# End Source File +# Begin Source File + +SOURCE=..\src\TtfUtil\Tt.h +# End Source File +# Begin Source File + +SOURCE=..\src\TtfUtil\TtFscdefs.h +# End Source File +# Begin Source File + +SOURCE=..\src\TtfUtil\TtfUtil.h +# End Source File +# Begin Source File + +SOURCE=..\src\TtfUtil\TtSfnt.h +# End Source File +# Begin Source File + +SOURCE=..\src\TtfUtil\TtSfnt_en.h +# End Source File +# Begin Source File + +SOURCE=..\include\UtilMem.h +# End Source File +# Begin Source File + +SOURCE=..\include\UtilRect.h +# End Source File +# Begin Source File + +SOURCE=..\include\UtilRegistry.h +# End Source File +# Begin Source File + +SOURCE=..\include\UtilString.h +# End Source File +# Begin Source File + +SOURCE=..\include\UtilVector.h +# End Source File # End Group # End Target # End Project |
From: <sil...@li...> - 2003-04-01 09:01:36
|
Update of /cvsroot/silgraphite/silgraphite/src/lib In directory sc8-pr-cvs1:/tmp/cvs-serv1418 Modified Files: Platform.cpp Log Message: rename include files and add stub platform functions for linux Index: Platform.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/lib/Platform.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Platform.cpp 11 Nov 2002 23:58:07 -0000 1.2 +++ Platform.cpp 1 Apr 2003 09:01:28 -0000 1.3 @@ -1,6 +1,7 @@ +#include "GrPlatform.h" + #ifdef _WIN32 #include "windows.h" -#include "platform.h" int Platform_UnicodeToANSI(const wchar_t * prgchwSrc, int cchwSrc, char * prgchsDst, int cchsDst) { @@ -16,4 +17,30 @@ { return ::MulDiv(nNumber, nNumerator, nDenominator); } +#else + +#include <iostream> + +int Platform_UnicodeToANSI(const wchar_t * prgchwSrc, int cchwSrc, char * prgchsDst, int cchsDst) +{ + //return ::WideCharToMultiByte(CP_ACP, 0, prgchwSrc, cchwSrc, prgchsDst, cchsDst, NULL, NULL); + std::cerr << "WideCharToMultiByte" << std::endl; + return 0; +} + +int Platform_AnsiToUnicode(const char * prgchsSrc, int cchsSrc, wchar_t * prgchwDst, int cchwDst) +{ + //return ::MultiByteToWideChar(CP_ACP, 0, prgchsSrc, cchsSrc, prgchwDst, cchwDst); + std::cerr << "AnsiToUnicode" << std::endl; + return 0; +} + +int Platform_MulDiv(int nNumber, int nNumerator, int nDenominator) +{ + //return MulDiv(nNumber, nNumerator, nDenominator); + return (nNumber * nNumerator) / nDenominator; +} + + + #endif |
From: <sil...@li...> - 2003-04-01 09:00:52
|
Update of /cvsroot/silgraphite/silgraphite/src/GrEngine In directory sc8-pr-cvs1:/tmp/cvs-serv1236 Modified Files: main.h Log Message: rename include files - src/GrEngine Index: main.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/GrEngine/main.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- main.h 2 Jan 2003 21:18:48 -0000 1.2 +++ main.h 1 Apr 2003 09:00:43 -0000 1.3 @@ -20,7 +20,7 @@ //:End Ignore #define NO_EXCEPTIONS 1 -#include "common.h" +#include "GrCommon.h" //:>******************************************************************************************** //:> Interfaces. @@ -59,7 +59,7 @@ #include "FwGr.h" // FieldWorks only #endif // GR_FW -#include "constants.h" +#include "GrConstants.h" #include "TtfUtil.h" #include "GrUtil.h" #include "FileInput.h" |
From: <sil...@li...> - 2003-04-01 09:00:16
|
Update of /cvsroot/silgraphite/silgraphite/src/Generic In directory sc8-pr-cvs1:/tmp/cvs-serv829 Modified Files: BinTree_i.cpp Debug.cpp Util.cpp resourcestrings.cpp Log Message: rename include files - src/Generic Index: BinTree_i.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/BinTree_i.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- BinTree_i.cpp 12 Nov 2002 22:24:15 -0000 1.3 +++ BinTree_i.cpp 1 Apr 2003 09:00:00 -0000 1.4 @@ -19,7 +19,7 @@ #define BINTREE_I_CPP_INCLUDED #include "BinTree.h" -#include "platform.h" +#include "GrPlatform.h" /*********************************************************************************************** BalTreeBase<Obj, Key> methods Index: Debug.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/Debug.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- Debug.cpp 12 Nov 2002 22:24:58 -0000 1.2 +++ Debug.cpp 1 Apr 2003 09:00:01 -0000 1.3 @@ -17,7 +17,7 @@ #endif //#include "common.h" //#include "main.h" -#include "debug.h" +#include "GrDebug.h" #pragma hdrstop #undef THIS_FILE DEFINE_THIS_FILE Index: Util.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/Util.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- Util.cpp 5 Nov 2002 21:29:13 -0000 1.1.1.1 +++ Util.cpp 1 Apr 2003 09:00:02 -0000 1.2 @@ -1,6 +1,6 @@ -#include "common.h" -#include "debug.h" +#include "GrCommon.h" +#include "GrDebug.h" /*---------------------------------------------------------------------------------------------- Swap two blocks of size cb starting at pv1 and pv2. Doesn't handle overlapping blocks. Index: resourcestrings.cpp =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/src/Generic/resourcestrings.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- resourcestrings.cpp 11 Nov 2002 23:50:30 -0000 1.2 +++ resourcestrings.cpp 1 Apr 2003 09:00:02 -0000 1.3 @@ -1,4 +1,4 @@ -#include "common.h" +#include "GrCommon.h" #include "GenericResource.h" struct ResourceString |
From: <sil...@li...> - 2003-04-01 08:55:32
|
Update of /cvsroot/silgraphite/silgraphite/include In directory sc8-pr-cvs1:/tmp/cvs-serv31411 Modified Files: GrClient.h GrData.h IGrGraphics.h LinkedList.h Makefile.am Throwable.h UtilVector.h Added Files: GrCommon.h GrConstants.h GrDebug.h GrMstypes.h GrPlatform.h Removed Files: common.h constants.h debug.h mstypes.h platform.h Log Message: rename some include files to look less common - the include dir part --- NEW FILE: GrCommon.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: Common.h Responsibility: Shon Katzenberger Last reviewed: Common generic header file. This header file checks for the following compile time switches: USING_MFC ----------------------------------------------------------------------------------------------*/ #ifdef _MSC_VER #pragma once #endif #ifndef Common_H #define Common_H 1 #include "platform.h" /*********************************************************************************************** Set the ENTER_DLL macro appropriately. This should be called at all potential DLL entry points including COM methods. ***********************************************************************************************/ //#ifndef ENTER_DLL // #ifdef USING_MFC // #define ENTER_DLL() AFX_MANAGE_STATE(AfxGetStaticModuleState()) // #else // #define ENTER_DLL() // #endif // USING_MFC //#endif // !ENTER_DLL /*********************************************************************************************** Windows / Framework headers. ***********************************************************************************************/ //#define STRICT 1 //#define WINVER 0x0501 //#undef _WIN32_WINNT //#define _WIN32_WINNT WINVER #ifdef _WIN32 #include <windows.h> #endif //#include <shlwapi.h> //#include <commctrl.h> //#include <ole2.h> // This keeps all the MIDL generated header files from including windows.h and ole2.h. //#define COM_NO_WINDOWS_H /*********************************************************************************************** Standard Headers. ***********************************************************************************************/ #include <malloc.h> #include <stdio.h> #include <stdarg.h> //#include <sys\timeb.h> //#include <time.h> //#include <math.h> #include <limits.h> #include <tchar.h> //#include <crtdbg.h> //#include <exception> #include <new> //inline void *__cdecl operator new(size_t, void *_P) // {return (_P); } // These are needed for the Task Scheduler section of FwExplorer. //#include <mstask.h> //#include <initguid.h> // #include <Usp10.h> // For Uniscribe (currently only in Language DLL). // Used for stack dumping and the like. // imagehlp.h must be compiled with packing to eight-byte-boundaries, // but does nothing to enforce that. //#pragma pack( push, before_imagehlp, 8 ) //#include <imagehlp.h> //#include <Tlhelp32.h> //#pragma pack( pop, before_imagehlp ) /*********************************************************************************************** Debug related definitions. ***********************************************************************************************/ #include "debug.h" /*********************************************************************************************** Turn off the goofy warnings. ***********************************************************************************************/ #pragma warning(disable: 4065) // Switch statement contains default but no case. #pragma warning(disable: 4097) // typedef-name 'xxx' used as synonym for class-name 'yyy'. #pragma warning(disable: 4100) // unreferenced formal parameter. #pragma warning(disable: 4192) // automatically excluding while importing. #pragma warning(disable: 4201) // nonstandard extension used : nameless struct/union. #pragma warning(disable: 4290) // exception specification ignored. #pragma warning(disable: 4310) // cast truncates constant value. #pragma warning(disable: 4355) // 'this' used in base member initializer list. #pragma warning(disable: 4505) // unreferenced local function has been removed. #pragma warning(disable: 4510) // default constructor could not be generated - caused by // applying ComSmartPtr to a non-interface class. #pragma warning(disable: 4511) // copy constructor could not be generated. #pragma warning(disable: 4512) // assignment operator could not be generated. #pragma warning(disable: 4610) // class 'xxx' can never be instantiated - user defined // constructor required - caused by applying ComSmartPtr to a non-interface class. #pragma warning(disable: 4660) // template-class specialization is already instantiated. #pragma warning(disable: 4701) // local variable 'xxx' may be used without being initialized. // We would like to keep this warning (4701) enabled but the compiler applies it in // places that are obviously OK. #pragma warning(disable: 4702) // unreachable code. We would like to keep this warning (4702) // enabled but the compiler applies it in places that are obviously OK. #pragma warning(disable: 4710) // not inlined. #pragma warning(disable: 4786) // identifier truncated in debug info. #pragma warning(disable: 4800) // forcing value to bool 'true' or 'false' (performance warning). /*********************************************************************************************** Simple types. ***********************************************************************************************/ typedef wchar_t wchar; typedef char schar; typedef unsigned char uchar; typedef unsigned char byte; typedef unsigned short ushort; typedef unsigned int uint; typedef unsigned long ulong; typedef unsigned short UOLECHAR; typedef __int64 int64; // Hungarian: lln typedef unsigned __int64 uint64; // Hungarian llu // TODO ShonK: Make generic use these where appropriate. #ifdef UNICODE typedef wchar achar; #else // !UNICODE typedef schar achar; #endif // UNICODE typedef achar * Psz; typedef const achar * Pcsz; /************************************************************************************* Offsets and addresses. AddrOf is useful for taking the address of an object that overloads the & operator. *************************************************************************************/ #ifdef _WIN32 #undef offsetof #define offsetof(cls,fld) ((int)&((cls *)0)->fld) #endif #define addrsafe_offsetof(cls,fld) reinterpret_cast<int>(AddrOf(((cls *)0)->fld)) #ifndef NO_ASM template<typename T> inline T * AddrOf(T & x) { T * pt; __asm { mov eax,x mov pt,eax } return pt; } #endif // This is to make a signed isizeof operator, otherwise we get tons of warnings about // signed / unsigned mismatches. #define isizeof(T) ((int)sizeof(T)) #define SizeOfArray(rgt) (isizeof(rgt) / isizeof(rgt[0])) /*********************************************************************************************** Tests for valid strings and pointers. ***********************************************************************************************/ inline bool ValidPsz(const wchar *pszw) { // TODO ShonK: Determine if IsBadStringPtrW is implemented on Win9x. return pszw != NULL && !::GrIsBadStringPtrW(pszw, 0x10000000); } inline bool ValidPsz(const schar *pszs) { return pszs != NULL && !::GrIsBadStringPtrA(pszs, 0x10000000); } template<typename T> inline bool ValidReadPtr(T *pt) { return pt != NULL && !::GrIsBadReadPtr(pt, isizeof(T)); } template<typename T> inline bool ValidWritePtr(T *pt) { return pt != NULL && !::GrIsBadWritePtr(pt, isizeof(T)); } inline bool ValidReadPtrSize(const void *pv, int cb) { if (cb < 0) return false; if (cb == 0) return true; return pv != NULL && !::GrIsBadReadPtr(pv, cb); } inline bool ValidWritePtrSize(void *pv, int cb) { // if (!bstr || ::IsBadReadPtr((byte *)bstr - isizeof(int), isizeof(int) + isizeof(OLECHAR))) // return false; // int cb = ((int *)bstr)[-1]; // if (::IsBadReadPtr((byte *)bstr - isizeof(int), isizeof(int) + isizeof(OLECHAR) + cb)) // return false; if (cb < 0) return false; if (cb == 0) return true; return pv != NULL && !::GrIsBadWritePtr(pv, cb); } /************************************************************************************* Cast "operators". *************************************************************************************/ template<typename T> inline T * GetPtr(void *pv, int ib) { return reinterpret_cast<T *>((byte *)pv + ib); } //:>******************************************************************************************** //:> Magic encodings. //:>******************************************************************************************** // These are magic encoding numbers that are not legal encodings, but are used to signal // the application to get the appropriate encoding from the application. For example, // a language project has a list of one or more analysis encodings. kencAnal would // tell the program to use the first encoding in this list. //enum //{ // kencAnal = 0xffffffff, // The first analysis encoding. // kencVern = 0xfffffffe, // The first vernacular encoding. // kencAnals = 0xfffffffd, // All analysis encodings. // kencVerns = 0xfffffffc // All vernacular encodings. //}; /************************************************************************************* Utility headers. *************************************************************************************/ #include "UtilRect.h" #include "GenericResource.h" #include "UtilString.h" //#include "Throwable.h" #include "UtilMem.h" #include "LinkedList.h" #include "BinTree.h" #include "UtilVector.h" #include "UtilRegistry.h" #undef offsetof //#define offsetof(cls,fld) ((int)&((cls *)0)->fld) #endif // !Common_H --- NEW FILE: GrConstants.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: constants.h Responsibility: Sharon Correll Last reviewed: Not yet. Description: Various global constants. ----------------------------------------------------------------------------------------------*/ #ifdef _MSC_VER #pragma once #endif #ifndef CONSTANTS_INCLUDED #define CONSTANTS_INCLUDED //:End Ignore enum { kMaxFeatures = 64, // kMaxComponentsPerGlyph = 8, kFieldsPerComponent = 4, kMaxSlotsPerRule = 64, kMaxSubTablesInFont = 256, // kMaxUserDefinableSlotAttrs = 16, }; // Maxima permitted by the binary format of the TrueType tables. enum { kMaxSubTables = 256, kMaxRenderingBehavior = 65536, // ie, the maximum value allowed for an ID kMaxGlyphAttrs = 65536, // Gloc table kMinGlyphAttrValue =-32768, kMaxGlyphAttrValue = 32768, kMaxPasses = 128, // Sil_sub table allows 256 kMaxPseudos = 65536, kMaxRendBehaviors = 256, kMaxReplcmtClasses = 256, // Class map kMaxComponents = 16383, }; enum { kPosInfinity = 0x3FFFFFF, kNegInfinity = kPosInfinity * -1, kInvalid = kNegInfinity }; enum { kGpointZero = -2 }; // for stream processing enum { kBacktrack = -2, kNextPass = -1, }; typedef enum DirCode { // Hungarian: dirc kdircUnknown = -1, kdircNeutral = 0, // other neutrals (default) - ON kdircL = 1, // left-to-right, strong - L kdircR = 2, // right-to-left, strong - R kdircRArab = 3, // Arabic letter, right-to-left, strong, AR kdircEuroNum = 4, // European number, left-to-right, weak - EN kdircEuroSep = 5, // European separator, left-to-right, weak - ES kdircEuroTerm = 6, // European number terminator, left-to-right, weak - ET kdircArabNum = 7, // Arabic number, left-to-right, weak - AN kdircComSep = 8, // Common number separator, left-to-right, weak - CS kdircWhiteSpace = 9, // white space, neutral - WS kdircBndNeutral = 10, // boundary neutral - BN // I think we need this too: kdircNSM = 16, // non-space mark // Special values for internal use: kdircLlb = 32, // left-to-right line-break kdircRlb = 33 // right-to-left line-break } DirCode; bool StrongDir(DirCode dirc); bool WeakDir(DirCode dirc); bool NeutralDir(DirCode dirc); bool RightToLeftDir(DirCode dirc); // Unicode characters with special meanings in the bidi algorithm enum BidiCodes { kchwLRE = 0x202A, // left-to-right embedding kchwRLE = 0x202B, // right-to-left embedding kchwPDF = 0x202C, // pop directional format kchwLRO = 0x202D, // left-to-right override kchwRLO = 0x202E, // right-to-left override kchwLRM = 0x200E, // left-to-right mark kchwRLM = 0x200F, // right-to-left mark }; typedef enum SlotAttrName { kslatAdvX = 0, kslatAdvY, kslatAttTo, kslatAttAtX, kslatAttAtY, kslatAttAtGpt, kslatAttAtXoff, kslatAttAtYoff, kslatAttWithX, kslatAttWithY, kslatAttWithGpt, kslatAttWithXoff, kslatAttWithYoff, kslatAttLevel, kslatBreak, kslatCompRef, kslatDir, kslatInsert, kslatPosX, kslatPosY, kslatShiftX, kslatShiftY, kslatUserDefn, kslatMax, kslatNoEffect = kslatMax + 1 // for internal use } SlotAttrName; typedef enum GlyphMetric { kgmetLsb = 0, kgmetRsb, kgmetBbTop, kgmetBbBottom, kgmetBbLeft, kgmetBbRight, kgmetBbHeight, kgmetBbWidth, kgmetAdvWidth, kgmetAdvHeight, kgmetAscent, kgmetDescent, } GlyphMetric; #endif // CONSTANTS_INCLUDED --- NEW FILE: GrDebug.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: debug.h Responsibility: Last reviewed: Description: Assert and debug definitions. ----------------------------------------------------------------------------------------------*/ #ifndef __DEBUG_H__ #define __DEBUG_H__ #ifdef _DEBUG #undef DEBUG #define DEBUG 1 #undef NDEBUG #define DEFINE_THIS_FILE static char THIS_FILE[] = __FILE__; #undef THIS_FILE #define THIS_FILE __FILE__ #else //!_DEBUG #undef DEBUG #undef NDEBUG #define NDEBUG 1 #define DEFINE_THIS_FILE //#define Debug(foo) #endif //!_DEBUG #if 0 //#ifdef DEBUG //#include <windows.h> typedef void (WINAPI * Pfn_Assert)(const char * pszExp, const char * pszFile, int nLine, HMODULE hmod); typedef Pfn_Assert Pfn_Warn; /*__declspec(dllimport)*/ void WINAPI WarnProc(const char * pszExp, const char * pszFile, int nLine, bool fCritical, HMODULE hmod); /*__declspec(dllimport)*/ void WINAPI AssertProc(const char * pszExp, const char * pszFile, int nLine, bool fCritical, HMODULE hmod); __declspec(dllimport) Pfn_Assert WINAPI SetAssertProc(Pfn_Assert pfnAssert); __declspec(dllimport) Pfn_Warn WINAPI SetWarnProc(Pfn_Warn pfnWarn); __declspec(dllimport) int WINAPI HideWarnings(bool f); __declspec(dllimport) int WINAPI HideAsserts(bool f); __declspec(dllimport) int WINAPI HideErrors(bool f); void WINAPI WarnHrProc(HRESULT hr, const char * pszFile, int nLine, bool fCritical); void WINAPI WarnProcLocal(const char * pszExp, const char * pszFile, int nLine, bool fCritical); void WINAPI AssertProcLocal(const char * pszExp, const char * pszFile, int nLine, bool fCritical); #undef assert #define Assert(exp) ((exp) || (AssertProcLocal(#exp, THIS_FILE, __LINE__, false), 0)) #define AssertC(exp) ((exp) || (AssertProcLocal(#exp, THIS_FILE, __LINE__, true), 0)) #define AssertMsg(exp, msg) ((exp) || (AssertProcLocal(msg, THIS_FILE, __LINE__, false), 0)) #define AssertMsgC(exp, msg) ((exp) || (AssertProcLocal(msg, THIS_FILE, __LINE__, true), 0)) #undef Warn #define Warn(psz) (void)(WarnProcLocal(psz, THIS_FILE, __LINE__, false)) #define WarnC(psz) (void)(WarnProcLocal(psz, THIS_FILE, __LINE__, true)) #undef WarnIf #define WarnIf(exp) (void)(!(exp) || (WarnProcLocal("(" #exp ") is true", THIS_FILE, \ __LINE__, false), 0)) #define WarnIfC(exp) (void)(!(exp) || (WarnProcLocal("(" #exp ") is true", THIS_FILE, \ __LINE__, true), 0)) #undef WarnUnless #define WarnUnless(exp) (void)((exp) || (WarnProcLocal("(" #exp ") is false", \ THIS_FILE, __LINE__, false), 0)) #define WarnUnlessC(exp) (void)((exp) || (WarnProcLocal("(" #exp ") is false", \ THIS_FILE, __LINE__, true), 0)) #undef WarnHr #define WarnHr(hr) ((SUCCEEDED(hr) || (WarnHrProc(hr, THIS_FILE, __LINE__, false), 0)), \ (hr)) #define WarnHrC(hr) ((SUCCEEDED(hr) || (WarnHrProc(hr, THIS_FILE, __LINE__, true), 0)), \ (hr)) class IgnoreWarnings { public: IgnoreWarnings() { HideWarnings(true); } ~IgnoreWarnings() { HideWarnings(false); } }; class IgnoreAsserts { public: IgnoreAsserts() { HideAsserts(true); } ~IgnoreAsserts() { HideAsserts(false); } }; class IgnoreErrors { private: IgnoreWarnings iw; IgnoreAsserts ia; }; #define Debug(exp) exp #define DoAssert(exp) Assert(exp) #define DoAssertC(exp) AssertC(exp) #define DoAssertHr(hr) Assert(SUCCEEDED(hr)) #define DoAssertHrC(hr) AssertC(SUCCEEDED(hr)) #else #undef assert #define Assert(exp) #define AssertC(exp) #define AssertMsg(exp, msg) #define AssertMsgC(exp, msg) #define Warn(psz) #define WarnC(psz) #define WarnIf(exp) #define WarnIfC(exp) #define WarnUnless(exp) #define WarnUnlessC(exp) #define WarnHr(hr) (hr) #define WarnHrC(hr) (hr) #define Debug(exp) #define DoAssert(exp) (exp) #define DoAssertC(exp) (exp) #define DoAssertHr(hr) (hr) #define DoAssertHrC(hr) (hr) #endif //DEBUG #define AssertPtr(pv) Assert(ValidReadPtr(pv)) #define AssertPtrN(pv) Assert(!(pv) || ValidReadPtr(pv)) #define AssertArray(pv, cv) Assert((cv) >= 0 && ValidReadPtrSize((pv), isizeof(*(pv)) * (cv))) #define AssertArrayN(pv, cv) Assert((cv) >= 0 && (!(pv) || ValidReadPtrSize((pv), isizeof(*(pv)) * (cv)))) #define AssertPtrSize(pv, cb) Assert((cb) >= 0 && ValidReadPtrSize((pv), cb)) #define AssertPfn(pfn) Assert(!IsBadCodePtr((FARPROC)(pfn))) #define AssertPfnN(pfn) Assert(!(pfn) || !IsBadCodePtr((FARPROC)(pfn))) #define AssertPsz(psz) Assert(ValidPsz(psz)) #define AssertPszN(psz) Assert(!(psz) || ValidPsz(psz)) #define AssertBstr(bstr) Assert(ValidBstr(bstr)) #define AssertBstrN(bstr) Assert(!(bstr) || ValidBstr(bstr)) #define AssertObj(pv) Assert(ValidReadPtr(pv) && (pv)->AssertValid()) #define AssertObjN(pv) Assert(!(pv) || ValidReadPtr(pv) && (pv)->AssertValid()) /*---------------------------------------------------------------------------------------------- This class implements custom output to the debugger. The results of Watch() can be viewed on a line in the Watch window. Output() writes to the Debugger Output window. Calls to Output() should be included in the Watch() function as needed. Watch() is executed every time the debugger displays this class in the Watch window. To use it: 1) Put the fillowing line in: \program files\Microsoft Visual Studio\Common\MSDev98\bin\AutoExp.dat in the [AutoExpand] section: DebugWatch=<WatchNV(),su> 2) In the class from which you want custom debug output, add the equivalent of: #ifdef DEBUG class Dbw1 : public DebugWatch { virtual OLECHAR * Watch(); ... }; Dbw1 m_dbw1; #endif //DEBUG 3) Implement the Watch() function to display the data you want to see, bracketed by #ifdef DEBUG / #endif. Note that Output() is LIMITED to 10 pointer-sized arguments. If you must have more, then call _CrtDbgReport() directly. Note also that _CrtDbgReport() is not implemented for wide characters, so neither is Output(). ----------------------------------------------------------------------------------------------*/ #if 0 //#ifdef DEBUG class DebugWatch { public: int m_nSerial; // increment and display this for positive affirmation of refresh DebugWatch() { m_nSerial = 0; } OLECHAR * WatchNV(); // debugger won't find it if it is virtual or inline. virtual OLECHAR * Watch() { return L"No DebugWatch string implemented"; } void Output (char *fmt, ...); // LIMITED to 10 pointer-sized arguments }; #endif //DEBUG #endif --- NEW FILE: GrMstypes.h --- #ifndef _MSTYPES_H #define _MSTYPES_H typedef unsigned short WORD, *PWORD, *LPWORD; typedef short SHORT, *PSHORT; #define __RPC_FAR typedef unsigned int uint; typedef unsigned int UINT,*PUINT,*LPUINT; typedef wchar_t WCHAR; typedef WCHAR *PWCHAR,*LPWCH,*PWCH,*NWPSTR,*LPWSTR,*PWSTR; typedef const WCHAR *LPCWCH,*PCWCH,*LPCWSTR,*PCWSTR; #ifndef OLE2ANSI typedef WCHAR OLECHAR; typedef LPWSTR LPOLESTR; typedef LPCWSTR LPCOLESTR; #define OLESTR(s) L##s #else typedef char OLECHAR; typedef LPSTR LPOLESTR; typedef LPCSTR LPCOLESTR; #define OLESTR(s) s #endif typedef OLECHAR *BSTR; typedef BSTR *LPBSTR; typedef void *HANDLE; typedef HANDLE *PHANDLE,*LPHANDLE; #define __int64 long long #ifndef NOMINMAX #ifndef max #define max(a,b) ((a)>(b)?(a):(b)) #endif #ifndef min #define min(a,b) ((a)<(b)?(a):(b)) #endif #endif typedef long LONG; typedef long *LPLONG; typedef LONG HRESULT; #define SUCCEEDED(Status) ((HRESULT)(Status) >= 0) #define FAILED(Status) ((HRESULT)(Status)<0) #define IS_ERROR(Status) ((unsigned long)(Status) >> 31 == SEVERITY_ERROR) typedef unsigned long DWORD; typedef DWORD COLORREF; #ifdef __GNUC__ #define PACKED __attribute__((packed)) #ifndef _stdcall #define _stdcall __attribute__((stdcall)) #endif #ifndef __stdcall #define __stdcall __attribute__((stdcall)) #endif #ifndef _cdecl #define _cdecl __attribute__((cdecl)) #endif #ifndef __cdecl #define __cdecl __attribute__((cdecl)) #endif #ifndef __declspec #define __declspec(e) __attribute__((e)) #endif #ifndef _declspec #define _declspec(e) __attribute__((e)) #endif #else #define PACKED #define _cdecl #define __cdecl #endif #define WINAPI __stdcall LONG WINAPI InterlockedIncrement(LPLONG); LONG WINAPI InterlockedDecrement(LPLONG); //int WINAPI MulDiv(int,int,int); #define E_POINTER 0x80004003L #define ETO_GLYPH_INDEX 0x0010 // from WinGDI.h typedef struct { WORD fract; SHORT value; } FIXED; #define S_OK 0 #define E_FAIL 0x80004005L #define E_OUTOFMEMORY 0x8007000EL #define E_UNEXPECTED 0x80000003L #define E_INVALIDARG 0x80000002L #endif --- NEW FILE: GrPlatform.h --- #ifndef _PLATFORM_H #define _PLATFORM_H #ifdef __GNUC__ #include "GrMstypes.h" #define NO_ASM #else typedef unsigned short wchar_t; #endif typedef unsigned char BYTE; #ifndef NULL #define NULL 0 #endif inline bool GrIsBadStringPtrW(const wchar_t *pszw, long base) { return (pszw == (const wchar_t *)NULL); } inline bool GrIsBadStringPtrA(const char *psza, long base) { return (psza == (const char *)NULL); } inline bool GrIsBadReadPtr(const void *lp, unsigned int ucb) { return false; } inline bool GrIsBadWritePtr(const void *lp, unsigned int ucb) { return false; } // Can probably remove this stuff: //#define GRE_S_OK 0 //#define GRE_E_FAIL 0x80004005L //#define GRE_E_OUTOFMEMORY 0x8007000EL //#define GRE_STG_E_READFAULT 0x80000001L //#define GRE_E_INVALIDARG 0x80000002L //#define GRE_E_UNEXPECTED 0x80000003L //#define GRE_E_NOTIMPL 0x80000004L //#ifndef SUCCEEDED //#define SUCCEEDED(Status) ((unsigned long)(Status) >= 0) //#endif // // and the inverse // //#ifndef FAILED //#define FAILED(Status) ((unsigned long)(Status)<0) //#endif int Platform_UnicodeToANSI(const wchar_t * prgchwSrc, int cchwSrc, char * prgchsDst, int cchsDst); int Platform_AnsiToUnicode(const char * prgchsSrc, int cchsSrc, wchar_t * prgchwDst, int cchwDst); int Platform_MulDiv(int nNumber, int nNumerator, int nDenominator); #endif Index: GrClient.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrClient.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- GrClient.h 5 Nov 2002 21:29:10 -0000 1.1.1.1 +++ GrClient.h 1 Apr 2003 08:55:03 -0000 1.2 @@ -1,6 +1,6 @@ -#include "common.h" -#include "constants.h" +#include "GrCommon.h" +#include "GrConstants.h" typedef WCHAR OLECHAR; #define __RPC_FAR @@ -18,4 +18,4 @@ class GrSlotOutput; class GrCharStream; class GrSegment; -class GrIStream; \ No newline at end of file +class GrIStream; Index: GrData.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/GrData.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- GrData.h 12 Feb 2003 15:35:53 -0000 1.4 +++ GrData.h 1 Apr 2003 08:55:06 -0000 1.5 @@ -22,6 +22,8 @@ #ifndef GRDATA_INCLUDED #define GRDATA_INCLUDED +#include "GrCommon.h" + /* //:End Ignore */ Index: IGrGraphics.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/IGrGraphics.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- IGrGraphics.h 2 Jan 2003 21:18:43 -0000 1.3 +++ IGrGraphics.h 1 Apr 2003 08:55:11 -0000 1.4 @@ -17,6 +17,9 @@ #ifndef IGRGRAPHICS_INCLUDED #define IGRGRAPHICS_INCLUDED +#include "GrResult.h" +#include "GrData.h" + /*---------------------------------------------------------------------------------------------- Class: IGrGraphics ----------------------------------------------------------------------------------------------*/ Index: LinkedList.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/LinkedList.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -u -d -r1.1.1.1 -r1.2 --- LinkedList.h 5 Nov 2002 21:29:10 -0000 1.1.1.1 +++ LinkedList.h 1 Apr 2003 08:55:13 -0000 1.2 @@ -15,7 +15,7 @@ #define LINKEDLIST_H #include <stdio.h> -#include "debug.h" +#include "GrDebug.h" /************************************************************************************* This contains a pointer to the data node. Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/Makefile.am,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- Makefile.am 12 Nov 2002 23:05:19 -0000 1.1 +++ Makefile.am 1 Apr 2003 08:55:13 -0000 1.2 @@ -9,6 +9,8 @@ pkginclude_HEADERS += $(grincludedir)/GrResult.h pkginclude_HEADERS += $(grincludedir)/GrSegment.h pkginclude_HEADERS += $(grincludedir)/IGrGraphics.h +pkginclude_HEADERS += $(grincludedir)/IGrGraphicsDrawing.h +pkginclude_HEADERS += $(grincludedir)/IGrGraphicsFont.h pkginclude_HEADERS += $(grincludedir)/IGrTextSource.h pkginclude_HEADERS += $(grincludedir)/LinkedList.h pkginclude_HEADERS += $(grincludedir)/Throwable.h @@ -17,8 +19,8 @@ pkginclude_HEADERS += $(grincludedir)/UtilRegistry.h pkginclude_HEADERS += $(grincludedir)/UtilString.h pkginclude_HEADERS += $(grincludedir)/UtilVector.h -pkginclude_HEADERS += $(grincludedir)/common.h -pkginclude_HEADERS += $(grincludedir)/constants.h -pkginclude_HEADERS += $(grincludedir)/debug.h -pkginclude_HEADERS += $(grincludedir)/mstypes.h -pkginclude_HEADERS += $(grincludedir)/platform.h +pkginclude_HEADERS += $(grincludedir)/GrCommon.h +pkginclude_HEADERS += $(grincludedir)/GrConstants.h +pkginclude_HEADERS += $(grincludedir)/GrDebug.h +pkginclude_HEADERS += $(grincludedir)/GrMstypes.h +pkginclude_HEADERS += $(grincludedir)/GrPlatform.h Index: Throwable.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/Throwable.h,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- Throwable.h 12 Nov 2002 19:36:40 -0000 1.4 +++ Throwable.h 1 Apr 2003 08:55:14 -0000 1.5 @@ -19,8 +19,8 @@ #ifndef _WIN32 #include <cwchar> #endif -#include "common.h" -#include "debug.h" +#include "GrCommon.h" +#include "GrDebug.h" /*---------------------------------------------------------------------------------------------- Standard class to wrap an HRESULT, HelpID, and message. Index: UtilVector.h =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/include/UtilVector.h,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- UtilVector.h 11 Nov 2002 23:40:14 -0000 1.1 +++ UtilVector.h 1 Apr 2003 08:55:15 -0000 1.2 @@ -28,8 +28,8 @@ #ifndef VECTOR_H_INCLUDED #define VECTOR_H_INCLUDED -#include "common.h" -#include "debug.h" +#include "GrCommon.h" +#include "GrDebug.h" /*********************************************************************************************** Element destruction. --- common.h DELETED --- --- constants.h DELETED --- --- debug.h DELETED --- --- mstypes.h DELETED --- --- platform.h DELETED --- |
From: <sil...@li...> - 2003-04-01 08:40:43
|
Update of /cvsroot/silgraphite/silgraphite In directory sc8-pr-cvs1:/tmp/cvs-serv24951 Modified Files: Makefile.am configure.ac Added Files: autogen.sh silgraphite.pc.in Log Message: update build system for pkg-config --- NEW FILE: autogen.sh --- #!/bin/sh ACLOCAL="$AUTODIR""aclocal" echo "*** Recreating aclocal.m4" echo "$ACLOCAL" $ACLOCAL; echo "*** Recreating configure" AUTOCONF="$AUTODIR""autoconf" AUTOHEAD="$AUTODIR""autoheader" # $AUTOHEAD ; $AUTOCONF; echo "*** Recreating the Makefile.in files" AUTOMAKE="$AUTODIR""automake" $AUTOMAKE --foreign -a -c; --- NEW FILE: silgraphite.pc.in --- prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ Name: SILGraphite Description: Script rendering engine Version: 0.9.1 Libs: -L${libdir} -lgrengine Cflags: -I${includedir}/silgraphite Index: Makefile.am =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/Makefile.am,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Makefile.am 6 Feb 2003 10:55:25 -0000 1.5 +++ Makefile.am 1 Apr 2003 08:40:33 -0000 1.6 @@ -1,17 +1,11 @@ AUTOMAKE_OPTIONS = 1.6 -INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/src/GrEngine -I$(top_srcdir)/src/TtfUtil -I$(top_srcdir)/src/lib -I$(top_srcdir)/src/Generic -#DEFS = -DNO_ASM -DUNICODE -#DEFS = -DNO_ASM +SUBDIRS = lib -lib_LIBRARIES = libgrengine.a +EXTRA_DIST = silgraphite.pc.in -libgrengine_a_SOURCES = -include include/Makefile.am -include include/c/Makefile.am -include src/Generic/Makefile.am -include src/lib/Makefile.am -include src/TtfUtil/Makefile.am -include src/GrEngine/Makefile.am -include src/c/Makefile.am +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = silgraphite.pc + +$(pkgconfig_DATA): config.status Index: configure.ac =================================================================== RCS file: /cvsroot/silgraphite/silgraphite/configure.ac,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- configure.ac 12 Nov 2002 23:06:05 -0000 1.3 +++ configure.ac 1 Apr 2003 08:40:33 -0000 1.4 @@ -1,11 +1,11 @@ # --------------------------------------------------------------------- # Initialisation # --------------------------------------------------------------------- -AC_INIT(silgraphite, 0.9.0, sil...@li...) +AC_INIT(silgraphite, 0.9.1, sil...@li...) AC_CONFIG_SRCDIR(src/lib/Platform.cpp) AC_PREREQ(2.52) AC_REVISION($Revision$) -AM_INIT_AUTOMAKE(silgraphite,0.9.0) +AM_INIT_AUTOMAKE(silgraphite,0.9.1) # --------------------------------------------------------------------- # Check Programs @@ -24,6 +24,21 @@ AC_ARG_ENABLE(profilefn,[ --enable-profilefn allow functioncheck profiling [default=no]],,enable_profilefn=no) AM_MAINTAINER_MODE + +# +# Find pkg-config +# +AC_PATH_PROG(PKG_CONFIG, pkg-config, no) +if test x$PKG_CONFIG = xno ; then + AC_MSG_ERROR([*** pkg-config not found. See http://www.freedesktop.org/software/pkgconfig/]) +fi + +if $PKG_CONFIG --atleast-pkgconfig-version 0.14 ; then + : +else + AC_MSG_ERROR([*** pkg-config too old; version 0.14 or better required.]) +fi + # --------------------------------------------------------------------- # Debug and profile # --------------------------------------------------------------------- @@ -64,5 +79,5 @@ # --------------------------------------------------------------------- # Final output # --------------------------------------------------------------------- -AC_CONFIG_FILES(Makefile) +AC_CONFIG_FILES(Makefile lib/Makefile silgraphite.pc) AC_OUTPUT |
Update of /cvsroot/silgraphite/silgraphite/contrib/freetype In directory sc8-pr-cvs1:/tmp/cvs-serv13574 Added Files: DummyGrGraphicsDrawing.h FTGrGraphicsFont.cpp FTGrGraphicsFont.h GrGraphics.cpp GrGraphics.h GrTextSrc.cpp GrTextSrc.h Makefile.am README README.cvs autogen.sh configure.ac fttest.cpp grfreetype.cpp grfreetype.h testtext.txt Log Message: danglassey: a test freetype app that just gets metrics and doesn't do drawing --- NEW FILE: DummyGrGraphicsDrawing.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: IGrGraphicsFont.h Responsibility: Sharon Correll Last reviewed: Not yet. Description: -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER #pragma once #endif #ifndef DUMMYGRGRAPHICSDRAWING_INCLUDED #define DUMMYGRGRAPHICSDRAWING_INCLUDED #include "IGrGraphicsDrawing.h" class GrGraphicsDrawing_Dummy : public virtual IGrGraphicsDrawing { public: GrGraphicsDrawing_Dummy() {};//(wxDC &m_dc, wxFont &m_font); ~GrGraphicsDrawing_Dummy() {}; virtual GrResult InvertRect(int twLeft, int twTop, int twRight, int twBottom) {return kresOk;}; virtual GrResult DrawTextExt(int x, int y, int cch, const OLECHAR __RPC_FAR * prgchw, UINT uOptions, const RECT __RPC_FAR * pRect, int __RPC_FAR * prgdx) {return kresOk;}; virtual GrResult get_YUnitsPerInch(int * pyInch) {*pyInch = 300; return kresOk;}; virtual GrResult SetupGraphics(LgCharRenderProps * pchrp) {return kresOk;}; //GrResult SetFont(const wxFont &hfont); //set font initially, call before SetupGraphics //not inherited from IGrGraphicsDrawing but needed to set up GrGraphics /* GrResult Initialize(HDC hdc); //load dc into obj GrResult SetFont(HFONT hfont); //set font initially, call before SetupGraphics HDC GetHDC(); */ private: /* // Member variables HDC m_hdc; //wxDC& m_hdc; HFONT m_hfont; // current font selected into DC, if any //wxFont& m_hfont; // current font selected into DC, if any LgCharRenderProps m_chrp; char m_szFaceName[64]; //wxString m_szFaceName; // Vertical resolution. Zero indicates not yet initialized. int m_yInch; char *windebugstring; */ }; #endif --- NEW FILE: FTGrGraphicsFont.cpp --- //#include "GrClient.h" #include "FTGrGraphicsFont.h" //#include "wx/log.h" //#include "grfreetype.h" // handle Windows specific way of returning coordinates for glyph points static int IntFromFixed(FIXED fx) { if (fx.fract >= 0x8000) return fx.value + 1; else return fx.value; } GrGraphicsFont_FT::GrGraphicsFont_FT() : m_ftfont(0) { ftdebugstring = new char[256]; } void GrGraphicsFont_FT::SetFTFont(const char *fontpath, int size, int horizres, int vertres) { //wxLogTrace(wxT("GrGraphicsFont_FT::GrGraphicsFont_FT")); m_ftfont = new FTFont(); //FT_Library library; /* handle to library */ err = FT_Init_FreeType( &library ); if ( err ) { return; } err = FT_New_Face( library, fontpath, //"c:/Windows/Fonts/piglatin.ttf""SILDoulos PigLatinDemo", 0, &m_ft_face ); if ( err ) { return; } err = FT_Set_Char_Size( m_ft_face, /* handle to face object */ 0, /* char_width in 1/64th of points */ size*64, /* char_height in 1/64th of points */ 96, /* horizontal device resolution default 72 96 is for Windows */ 96 ); /* vertical device resolution default 72 96 is for Windows */ //???where do you get char_height from? : m_yInch/3 ??? //???where do you get horizontal device resolution from? : always use default? //???where do you get vertical device resolution from? : always use default? m_ftfont->ft_face = m_ft_face; m_ftfont->gmsize = 0; m_ftfont->orientation = 0; m_ftfont->charset = 0; //m_ftfont->gm = new GM(); //if ( err ) { return GDI_ERROR; } // return ERROR condition } GrGraphicsFont_FT::~GrGraphicsFont_FT() { FT_Done_Face(m_ftfont->ft_face); delete m_ftfont; delete ftdebugstring; } /*GrResult GrGraphicsFont_FT::GetFTTextMetrics() { return kresOk; } */ GrResult GrGraphicsFont_FT::GetFontEmSquare(int * pxyFontEmSquare) { //wxLogTrace(wxT("GrGraphicsFont_FT::GetFontEmSquare")); ftTEXTMETRIC tm; if (!ftGetTextMetrics(m_ftfont, &tm)) return kresUnexpected; ////wxLogTrace("GrGraphicsFont_FT::GetFontEmSquare %d, %d", tm.tmHeight,tm.tmInternalLeading); *pxyFontEmSquare = tm.tmHeight - tm.tmInternalLeading; sprintf(ftdebugstring, "FontEmSquare is %d: height %d internalleading %d\n", *pxyFontEmSquare, tm.tmHeight, tm.tmInternalLeading); //OutputDebugString(ftdebugstring); //wxLogTrace(wxT("GrGraphicsFont_FT::GetFontEmSquare returning %d"), *pxyFontEmSquare); /* if (!m_txtmetric->Ok()) return kresUnexpected; *pxyFontEmSquare = m_txtmetric->Height() - m_txtmetric->InternalLeading(); */ return kresOk; } static int errorcount = 0; GrResult GrGraphicsFont_FT::GetGlyphMetrics(int chw, int * pxBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY) { ftGLYPHMETRICS gm; #ifdef _MSC_VER const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; if (GDI_ERROR == ::GetGlyphOutline(m_tmphdc, chw, GGO_GLYPH_INDEX | GGO_METRICS, &gm, 0, NULL, &mat2)) { return kresUnexpected; } int pxBoundingWidth2 = gm.gmBlackBoxX; int pyBoundingHeight2 = gm.gmBlackBoxY; int pxBoundingX2 = gm.gmptGlyphOrigin.x; int pyBoundingY2 = gm.gmptGlyphOrigin.y; int pxAdvanceX2 = gm.gmCellIncX; int pyAdvanceY2 = gm.gmCellIncY; #endif /*DWORD ftGetGlyphOutline(FTFont *font, UINT glyph, UINT format, LPGLYPHMETRICS lpgm, DWORD buflen, LPVOID buf \*, const MAT2* lpmat*\);*/ //wxLogTrace(wxT("GrGraphicsFont_FT::GetGlyphMetrics")); //GLYPHMETRICS gm; //const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; if (GDI_ERROR == ftGetGlyphOutline2(m_ftfont, chw, GGO_GLYPH_INDEX | GGO_METRICS, &gm, 0, NULL)) { return kresUnexpected; } *pxBoundingWidth = gm.gmBlackBoxX; int pxBoundingWidth2 = gm.gmBlackBoxX; if (*pxBoundingWidth != pxBoundingWidth2) { errorcount++; sprintf(ftdebugstring, "%d:ERROR1 in pxBoundingWidth is %d:%d\n", errorcount, *pxBoundingWidth, pxBoundingWidth2); } else { sprintf(ftdebugstring, "GetGlyphMetrics pxBoundingWidth is %d:%d\n", *pxBoundingWidth, pxBoundingWidth2); } OutputDebugString(ftdebugstring); *pyBoundingHeight = gm.gmBlackBoxY; int pyBoundingHeight2 = gm.gmBlackBoxY; if (*pyBoundingHeight != pyBoundingHeight2) { errorcount++; sprintf(ftdebugstring, "%d:ERROR2 in pxBoundingHeight is %d:%d\n", errorcount, *pyBoundingHeight, pyBoundingHeight2); } else { sprintf(ftdebugstring, "GetGlyphMetrics pyBoundingHeight is %d:%d\n", *pyBoundingHeight, pyBoundingHeight2); } OutputDebugString(ftdebugstring); *pxBoundingX = gm.gmptGlyphOrigin.x; int pxBoundingX2 = gm.gmptGlyphOrigin.x; if (*pxBoundingX != pxBoundingX2) { errorcount++; sprintf(ftdebugstring, "%d:ERROR3 in pxBoundingX is %d:%d\n", errorcount, *pxBoundingX, pxBoundingX2); } else { sprintf(ftdebugstring, "GetGlyphMetrics pxBoundingX is %d:%d\n", *pxBoundingX, pxBoundingX2); } OutputDebugString(ftdebugstring); *pyBoundingY = gm.gmptGlyphOrigin.y; int pyBoundingY2 = gm.gmptGlyphOrigin.y; if (*pyBoundingY != pyBoundingY2) { errorcount++; sprintf(ftdebugstring, "%d:ERROR4 in pxBoundingY is %d:%d\n", errorcount, *pyBoundingY, pyBoundingY2); } else { sprintf(ftdebugstring, "GetGlyphMetrics pyBoundingY is %d:%d\n", *pyBoundingY, pyBoundingY2); } OutputDebugString(ftdebugstring); *pxAdvanceX = gm.gmCellIncX; int pxAdvanceX2 = gm.gmCellIncX; if (*pxAdvanceX != pxAdvanceX2) { errorcount++; sprintf(ftdebugstring, "%d:ERROR5 in pxAdvanceX is %d:%d\n", errorcount, *pxAdvanceX, pxAdvanceX2); } else { sprintf(ftdebugstring, "GetGlyphMetrics pxAdvanceX is %d:%d\n", *pxAdvanceX, pxAdvanceX2); } OutputDebugString(ftdebugstring); *pyAdvanceY = gm.gmCellIncY; int pyAdvanceY2 = gm.gmCellIncY; sprintf(ftdebugstring, "GetGlyphMetrics pyAdvanceY is %d:%d\n", *pyAdvanceY, pyAdvanceY2); OutputDebugString(ftdebugstring); /* wxGlyphMetric *gm = new wxGlyphMetric(m_hdc, chw); if (!gm->Ok()) return kresUnexpected; *pxBoundingWidth = gm->BlackBoxX(); *pyBoundingHeight = gm->BlackBoxY(); *pxBoundingX = gm->GlyphOriginX(); *pyBoundingY = gm->GlyphOriginY(); *pxAdvanceX = gm->CellIncX(); *pyAdvanceY = gm->CellIncY(); delete gm; */ return kresOk; } GrResult GrGraphicsFont_FT::GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax) { //wxLogTrace(wxT("GrGraphicsFont_FT::GetFontData")); if ( err ) return kresFail; *pcbTableSz = -1; DWORD cbTableSz = ftGetFontData(m_ftfont, nTableId, 0, NULL, 0); if (GDI_ERROR == cbTableSz) return kresFail; *pcbTableSz = cbTableSz; if (*pcbTableSz > cbMax) return kresFalse; // not enough room in buffer if (GDI_ERROR == ftGetFontData(m_ftfont, nTableId, 0, prgb, cbTableSz)) { return kresUnexpected; } return kresOk; //return kresUnexpected; } GrResult GrGraphicsFont_FT::XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet) { //wxLogTrace(wxT("GrGraphicsFont_FT::XYFromGlyphPoint")); ftGLYPHMETRICS gm; //const MAT2 mat2 = {{0,1}, {0,0}, {0,0}, {0,1}}; WORD flag = GGO_GLYPH_INDEX | GGO_NATIVE; //UINT cbBuf = ftGetGlyphOutline(m_ftfont, chw, flag, &gm, 0, NULL, &mat2); UINT cbBuf = ftGetGlyphOutline(m_ftfont, chw, flag, &gm, 0, NULL); if (cbBuf <= 0) return kresUnexpected; BYTE * pGlyphData = new BYTE[cbBuf]; if (!pGlyphData) return kresOutOfMemory; //if (GDI_ERROR == ftGetGlyphOutline(m_ftfont, chw, flag, &gm, cbBuf, pGlyphData,&mat2)) if (GDI_ERROR == ftGetGlyphOutline(m_ftfont, chw, flag, &gm, cbBuf, pGlyphData)) return kresUnexpected; TTPOLYGONHEADER * pPolyHdr; TTPOLYCURVE * pPolyCurve; pPolyHdr = (TTPOLYGONHEADER *)pGlyphData; int nCurPoint; nCurPoint = 0; // If the last curve in the polygon is a spline, the last point in this curve will // repeat the point from the the polygon header. This adds an extra point to the data // returned by Windows that is not in the TTF font file. Test to set nExtraPt is below. int nExtraPt = 0; while ((BYTE *)pPolyHdr < (pGlyphData + cbBuf)) { if (nPoint == nCurPoint) { *pxRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x); *pyRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y); delete [] pGlyphData; return kresOk; } nCurPoint++; pPolyCurve = (TTPOLYCURVE *)(pPolyHdr + 1); if (pPolyHdr->dwType == TT_POLYGON_TYPE) { while ((BYTE *)pPolyCurve < (BYTE *)pPolyHdr + pPolyHdr->cb) { if (pPolyCurve->wType == TT_PRIM_LINE || pPolyCurve->wType == TT_PRIM_QSPLINE) { int j = pPolyCurve->cpfx - 1; // index of last point in the curve if (pPolyCurve->wType == TT_PRIM_QSPLINE && // test if this is the last curve pPolyHdr->cb - (int)((BYTE *)(&pPolyCurve->apfx[j]) - (BYTE *)(pPolyHdr)) == sizeof (POINTFX) && IntFromFixed(pPolyCurve->apfx[j].x) == IntFromFixed(pPolyHdr->pfxStart.x) && IntFromFixed(pPolyCurve->apfx[j].y) == IntFromFixed(pPolyHdr->pfxStart.y)) { nExtraPt = 1; } else nExtraPt = 0; if (nPoint < nCurPoint + pPolyCurve->cpfx - nExtraPt) { *pxRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].x); *pyRet = IntFromFixed(pPolyCurve->apfx[nPoint - nCurPoint].y); delete [] pGlyphData; return kresOk; } } else { delete [] pGlyphData; return kresUnexpected; } nCurPoint += pPolyCurve->cpfx - nExtraPt; pPolyCurve = (TTPOLYCURVE *)&pPolyCurve->apfx[pPolyCurve->cpfx]; } } else if (pPolyHdr->dwType == 0) { break; } else { delete [] pGlyphData; return kresUnexpected; } pPolyHdr = (TTPOLYGONHEADER *)((BYTE *)pPolyHdr + pPolyHdr->cb); } delete [] pGlyphData; return kresUnexpected; } GrResult GrGraphicsFont_FT::get_FontAscent(int* pdy) { //wxLogTrace(wxT("GrGraphicsFont_FT::get_FontAscent")); ftTEXTMETRIC tm; if (!ftGetTextMetrics(m_ftfont, &tm)) return kresUnexpected; *pdy = tm.tmAscent; sprintf(ftdebugstring, "get_FontAscent is %d\n", *pdy); //OutputDebugString(ftdebugstring); /* TEXTMETRIC tm; if (!GetTextMetrics(m_hdc, &tm)) return kresUnexpected; *pdy = tm.tmAscent; */ /* if (!m_txtmetric->Ok()) return kresUnexpected; *pdy = m_txtmetric->Ascent(); */ return kresOk; } GrResult GrGraphicsFont_FT::get_FontDescent(int* pdy) { //wxLogTrace(wxT("GrGraphicsFont_FT::get_FontDescent")); //bool ftGetTextMetrics(FTFont *font, LPTEXTMETRICW ptm); ftTEXTMETRIC tm; if (!ftGetTextMetrics(m_ftfont, &tm)) return kresUnexpected; *pdy = tm.tmDescent; sprintf(ftdebugstring, "get_FontDescent is %d\n", *pdy); //OutputDebugString(ftdebugstring); /*if (!m_txtmetric->Ok()) return kresUnexpected; *pdy = m_txtmetric->Descent(); */ return kresOk; } #ifdef _MSC_VER void GrGraphicsFont_FT::SetHDC(HDC m_hdc) { m_tmphdc = m_hdc; } #endif --- NEW FILE: FTGrGraphicsFont.h --- /*--------------------------------------------------------------------*//*:Ignore this sentence. Copyright (C) 1999, 2001 SIL International. All rights reserved. Distributable under the terms of either the Common Public License or the GNU Lesser General Public License, as specified in the LICENSING.txt file. File: IGrGraphicsFont.h Responsibility: Sharon Correll Last reviewed: Not yet. Description: -------------------------------------------------------------------------------*//*:End Ignore*/ #ifdef _MSC_VER #pragma once #endif #ifndef FTGRGRAPHICSFONT_INCLUDED #define FTGRGRAPHICSFONT_INCLUDED #include "IGrGraphicsFont.h" #include "grfreetype.h" /*---------------------------------------------------------------------------------------------- Class: FTGrGraphicsFont ----------------------------------------------------------------------------------------------*/ class GrGraphicsFont_FT : public IGrGraphicsFont { public: GrGraphicsFont_FT(); ~GrGraphicsFont_FT(); virtual GrResult GetFontEmSquare(int * pxyFontEmSquare); virtual GrResult GetGlyphMetrics(int chw, int * psBoundingWidth, int * pyBoundingHeight, int * pxBoundingX, int * pyBoundingY, int * pxAdvanceX, int * pyAdvanceY); virtual GrResult GetFontData(int nTableId, int * pcbTableSz, byte * prgb, int cbMax); virtual GrResult XYFromGlyphPoint(int chw, int nPoint, int * pxRet, int * pyRet); virtual GrResult get_FontAscent(int* pdy); virtual GrResult get_FontDescent(int* pdy); virtual void SetFTFont(const char *fontpath, int size, int horizres, int vertres); #ifdef _MSC_VER virtual void SetHDC(HDC m_hdc); #endif private: LPFTFont m_ftfont; FT_Face m_ft_face; // Vertical resolution. Zero indicates not yet initialized. //int m_yInch; FT_Library library; FT_Error err; char *ftdebugstring; #ifdef _MSC_VER HDC m_tmphdc; #endif }; #endif // FTGRGRAPHICSFONT_INCLUDED --- NEW FILE: GrGraphics.cpp --- #include "GrClient.h" #include "GrGraphics.h" // handle Windows specific way of returning coordinates for glyph points static int IntFromFixed(FIXED fx) { if (fx.fract >= 0x8000) return fx.value + 1; else return fx.value; } GrGraphics::GrGraphics(const char *fontpath, int size) { /* char *debugstring = new char[256]; int horizres = GetDeviceCaps(GetHDC(), LOGPIXELSX); int vertres = GetDeviceCaps(GetHDC(), LOGPIXELSY); sprintf (debugstring, "horizres %d, vertres %d\n", horizres, vertres); OutputDebugString(debugstring); delete debugstring; */ int horizres = 0; int vertres = 0; SetFTFont(fontpath, size, horizres, vertres); } GrGraphics::~GrGraphics() { } /* GrResult GrGraphics::SetFont(HFONT hfont) { if (hfont == m_hfont) return kresOk; HFONT hfontPrev = (HFONT) SelectObject(m_hdc, hfont); if (!hfontPrev) return kresUnexpected; DeleteObject(hfontPrev); if (m_hfont) { DeleteObject(m_hfont); } m_hfont = hfont; //save the font name which will always be used in this obj int cbOtm = GetOutlineTextMetrics(m_hdc, 0, NULL); OUTLINETEXTMETRIC * pOtm = (OUTLINETEXTMETRIC *)new BYTE[cbOtm]; if (!GetOutlineTextMetrics(m_hdc, cbOtm, pOtm)) return kresUnexpected; strcpy(m_szFaceName, (char *)pOtm + (int)pOtm->otmpFaceName); delete pOtm; return kresOk; } */ --- NEW FILE: GrGraphics.h --- #ifndef GRGRAPHICS_INCLUDED #define GRGRAPHICS_INCLUDED #include "FTGrGraphicsFont.h" #include "DummyGrGraphicsDrawing.h" class GrGraphics : public GrGraphicsFont_FT, public GrGraphicsDrawing_Dummy { public: GrGraphics(const char *fontpath, int size); ~GrGraphics(); }; #endif --- NEW FILE: GrTextSrc.cpp --- #include "GrClient.h" #include "GrTextSrc.h" GrTextSrc::GrTextSrc(OLECHAR * pszText, LgCharRenderProps & chrp, OLECHAR * prgchFontVar, int ichFontVar) { m_cchLength = wcslen(pszText); m_prgchText = new OLECHAR[m_cchLength + 1]; memcpy(m_prgchText, pszText, isizeof(OLECHAR) * m_cchLength); m_prgchText[m_cchLength] = L'\0'; // zero-terminate memcpy(&m_chrp, &chrp, isizeof(LgCharRenderProps)); memset(m_rgchFontVar, 0, isizeof(m_rgchFontVar)); memcpy(m_rgchFontVar, prgchFontVar, min(ichFontVar, isizeof(m_rgchFontVar))); } GrTextSrc::~GrTextSrc() { delete [] m_prgchText; } GrResult GrTextSrc::Fetch(int ichMin, int ichLim, OLECHAR * prgchBuf) { if (ichLim > m_cchLength) return kresInvalidArg; memcpy(prgchBuf, m_prgchText + ichMin, isizeof(OLECHAR) * (ichLim - ichMin)); return kresOk; } GrResult GrTextSrc::get_Length(int * pcch) { *pcch = m_cchLength; return kresOk; } GrResult GrTextSrc::GetCharProps(int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim) { memcpy(pchrp, &m_chrp, isizeof(LgCharRenderProps)); *pichMin = 0; *pichLim = m_cchLength; return kresOk; } GrResult GrTextSrc::GetParaProps(int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim) { memset(pchrp, 0, isizeof(LgParaRenderProps)); return kresNotImpl; } GrResult GrTextSrc::GetFontVariations(int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim) { *pich = isizeof(m_rgchFontVar); if (ichMax < *pich) return kresFalse; memcpy(prgchFontVar, m_rgchFontVar, isizeof(m_rgchFontVar)); *pichMin = 0; *pichLim = m_cchLength; return kresOk; } // Return a Graphite-compatible text source that can be stored in a // Graphite segment. void GrTextSrc::TextSrcObject(IGrTextSource ** ppgts) { *ppgts = this; } // When a segment is being destroyed, there is nothing to do, // since this is a pointer to an object that is allocated elsewhere. void GrTextSrc::DeleteTextSrcPtr() { } --- NEW FILE: GrTextSrc.h --- #ifndef GRTEXTSOURCE_INCLUDED #define GRTEXTSOURCE_INCLUDED #include "IGrTextSource.h" class GrTextSrc : public IGrTextSource { public: GrTextSrc(OLECHAR * pszText, LgCharRenderProps & chrp, OLECHAR * prgchFontVar, int ichFontVar); ~GrTextSrc(); virtual GrResult Fetch(int ichMin, int ichLim, OLECHAR * prgchBuf); virtual GrResult get_Length(int * pcch); virtual GrResult GetCharProps(int ich, LgCharRenderProps * pchrp, int * pichMin, int * pichLim); virtual GrResult GetParaProps(int ich, LgParaRenderProps * pchrp, int * pichMin, int * pichLim); virtual GrResult GetFontVariations(int ich, OLECHAR * prgchFontVar, int ichMax, int * pich, int * pichMin, int * pichLim); virtual void TextSrcObject(IGrTextSource ** ppgts); virtual void DeleteTextSrcPtr(); protected: OLECHAR * m_prgchText; int m_cchLength; OLECHAR m_rgchFontVar[64]; LgCharRenderProps m_chrp; }; #endif --- NEW FILE: Makefile.am --- bin_PROGRAMS = fttest AM_CFLAGS = $(FT_CFLAGS) $(GR_CFLAGS) AM_CXXFLAGS = $(FT_CFLAGS) $(GR_CFLAGS) fttest_SOURCES = grfreetype.cpp FTGrGraphicsFont.cpp GrTextSrc.cpp \ GrGraphics.cpp fttest.cpp fttest_LDADD = $(FT_LIBS) $(GR_LIBS) --- NEW FILE: README --- You need to have installed graphite before you build this app --- NEW FILE: README.cvs --- To generate the build system run ./autogen.sh It requires automake >= 1.6 and autoconf >= 2.52 --- NEW FILE: autogen.sh --- #!/bin/sh ACLOCAL="$AUTODIR""aclocal" echo "*** Recreating aclocal.m4" echo "$ACLOCAL" $ACLOCAL; echo "*** Recreating configure" AUTOCONF="$AUTODIR""autoconf" AUTOHEAD="$AUTODIR""autoheader" # $AUTOHEAD ; $AUTOCONF; echo "*** Recreating the Makefile.in files" AUTOMAKE="$AUTODIR""automake" $AUTOMAKE --foreign -a -c; --- NEW FILE: configure.ac --- # --------------------------------------------------------------------- # Initialisation # --------------------------------------------------------------------- AC_INIT(fttest, 0.9.1, sil...@li...) AC_CONFIG_SRCDIR(GrGraphics.cpp) AC_PREREQ(2.52) AC_REVISION($Revision: 1.1 $) AM_INIT_AUTOMAKE(fttest,0.9.1) # --------------------------------------------------------------------- # Check Programs # --------------------------------------------------------------------- AC_LANG(C++) AC_PROG_CC AC_PROG_CXX AC_PROG_INSTALL # --------------------------------------------------------------------- # Enable options # --------------------------------------------------------------------- AC_ARG_ENABLE(debug,[ --enable-debug build debug library [default=no]],,enable_debug=no) AC_ARG_ENABLE(profile,[ --enable-profile allow profiling [default=no]],,enable_profile=no) AC_ARG_ENABLE(profilefn,[ --enable-profilefn allow functioncheck profiling [default=no]],,enable_profilefn=no) AM_MAINTAINER_MODE # --------------------------------------------------------------------- # Debug and profile # --------------------------------------------------------------------- CXXFLAGS="$CXXFLAGS -ftemplate-depth-25" if test x$enable_debug = xyes; then if test x$ac_cv_prog_cc_g = xyes; then CFLAGS="-g -O0" else CFLAGS="-O0" fi if test x$ac_cv_prog_cxx_g = xyes; then CXXFLAGS="-g -O0" else CXXFLAGS="-O0" fi CFLAGS="$CFLAGS -Werror" CXXFLAGS="$CXXFLAGS -Werror" fi # AC_DEFINE(DEBUG) #else # AC_DEFINE(NDEBUG) #fi if test x$enable_profile = xyes; then CFLAGS="$CFLAGS -pg" CXXFLAGS="$CXXFLAGS -pg" fi if test x$enable_profilefn = xyes; then CFLAGS="$CFLAGS -g -finstrument-functions" CXXFLAGS="$CXXFLAGS -g -finstrument-functions" LIBS="$LIBS -g -finstrument-functions -lfnccheck" fi #AC_CHECK_LIB(grengine, grtxtDone) # --------------------------------------------------------------------- # Check for freetype # --------------------------------------------------------------------- FT_CFLAGS= FT_LIBS= AC_PATH_PROG(FT_CONFIG, freetype-config, no) if test "$CURL_CONFIG" = "no" ; then AC_MSG_ERROR([*** freetype-config not found.]) else FT_CFLAGS=`$FT_CONFIG --cflags` FT_LIBS=`$FT_CONFIG --libs` fi GR_CFLAGS= GR_LIBS= # # Find pkg-config # AC_PATH_PROG(PKG_CONFIG, pkg-config, no) if test x$PKG_CONFIG = xno ; then AC_MSG_ERROR([*** pkg-config not found. See http://www.freedesktop.org/software/pkgconfig/]) fi if $PKG_CONFIG --atleast-pkgconfig-version 0.14 ; then if $PKG_CONFIG --exists silgraphite ; then GR_CFLAGS=`$PKG_CONFIG --cflags silgraphite` GR_LIBS=`$PKG_CONFIG --libs silgraphite` else AC_MSG_ERROR([*** silgraphite not found. See http://silgraphite.sourceforge.net]) fi else AC_MSG_ERROR([*** pkg-config too old; version 0.14 or better required.]) fi # --------------------------------------------------------------------- # Substitute variables into makefiles # --------------------------------------------------------------------- AC_SUBST(FT_CFLAGS) AC_SUBST(FT_LIBS) AC_SUBST(GR_CFLAGS) AC_SUBST(GR_LIBS) # --------------------------------------------------------------------- # Final output # --------------------------------------------------------------------- AC_CONFIG_FILES(Makefile) AC_OUTPUT --- NEW FILE: fttest.cpp --- #include "GrClient.h" #include "GrGraphics.h" #include "GrTextSrc.h" #include "GrEngine.h" #include "GrSegment.h" #include <iostream> GrEngine greng; int main() { //hdc = BeginPaint(hWnd, &ps); //HFONT hFont; //LOGFONT lf; int size = 24; //memset(&lf, '\0', sizeof(LOGFONT)); //lf.lfCharSet = DEFAULT_CHARSET; //lf.lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72); //strcpy(lf.lfFaceName, "Doulos SIL"); //strcpy(lf.lfFaceName, "SILDoulos PigLatinDemo"); //strcpy(lf.lfFaceName, "SILDoulos StackDiacDemo"); //hFont = CreateFontIndirect(&lf); //GrGraphics * pgrfx = new GrGraphics("./stakdiac.ttf", size); GrGraphics * pgrfx = new GrGraphics("./piglatin.ttf", size); //if (pgrfx->Initialize(hdc) != kresOk) //MessageBox(hWnd, "GrGraphics didn't initialize", "", MB_OK); // std::cerr << "GrGraphics didn't initialize" << std::endl; //pgrfx->SetHDC(hdc); //pgrfx->SetFont(hFont); LgCharRenderProps * pchrp = new LgCharRenderProps(); memset(pchrp, '\0', sizeof(LgCharRenderProps)); pchrp->dympHeight = size * 1000; // font size in millipoints //could set szFaceName for consistency but ignored //wcscpy(pchrp->szFaceName, L"Doulos SIL"); //wcscpy(pchrp->szFaceName, L"SILDoulos PigLatinDemo"); //pchrp->clrBack = RGB(255, 255, 255); //white //pchrp->clrFore = RGB(0, 0, 0); //black //pgrfx->SetupGraphics(pchrp); GrTextSrc * pgrtext; wchar_t *testtext = new wchar_t[256]; OutputDebugString("opening file\n"); FILE *txtfile = fopen( "./testtext.txt", "rb" ); char *debugstring = new char[256]; //memset(debugstring, '\0', 255); if (txtfile) { OutputDebugString("opened file\n"); //char ch = fgetc( txtfile ); //sprintf(debugstring, " got char 0 %c\n", ch); //OutputDebugString(debugstring); wchar_t ch = fgetc( txtfile ); sprintf(debugstring, " got char 0 %c\n", ch); OutputDebugString(debugstring); int i; for( i=0; ((i < 255) && !feof( txtfile ) ); i++ ) { testtext[i] = ch; ch = fgetc( txtfile ); sprintf(debugstring, " got char %d %c\n", i+1, ch); OutputDebugString(debugstring); } testtext[i-1] = '\0'; fclose(txtfile); } else { testtext[0] = '\0'; OutputDebugString("failed to open file\n"); exit(-1) ; } delete [] debugstring; //pgrtext = new GrTextSrc(L"Now i\x0303\x0301s the time to render in Graphite", *pchrp, L"", 0); //pgrtext = new GrTextSrc(L"Hello World!", *pchrp, L"", 0); pgrtext = new GrTextSrc(testtext, *pchrp, L"", 0); delete [] testtext; //pgrtext = new GrTextSrc(L"Now i\x0303\x0301s the time to render in Graphite", *pchrp, L"", 0); //pgrtext = new GrTextSrc(L"Hello World!", *pchrp, L"", 0); GrSegment * pgrseg; int cchSeg; // how many characters fit in the segment int dxWidth; // width of resulting segment LgEndSegmentType est; // why the segment was ended BYTE rgbNextSeg[256]; int ciNextSeg; OLECHAR errmsg[128]; int dichContext; GrResult res = greng.FindBreakPoint(pgrfx, pgrtext, 0, // start at the beginning of the string 100, 100, // try to handle entire string if possible false, // need final break true, // is this the first segment on the line? 60000, // width available klbWordBreak, // preferred kind of line break klbClipBreak, // worst-case line break ktwshAll, // standard handling of trailing white space false, // paragraph is left-to-right &pgrseg, &cchSeg, &dxWidth, &est, 0, NULL, // no preceding segment to handle 256, rgbNextSeg, &ciNextSeg, // info for following segment, exception thrown if this missing &dichContext, // index of first char of interest to following seg errmsg, 128); // for returning an error message if (res != kresOk) //MessageBox(hWnd, "Could not create segment", "", MB_OK); std::cerr << "Could not create segment." << std::endl; RECT rSrc; rSrc.top = -30; rSrc.left = -30; rSrc.right = 66; rSrc.bottom = 66; RECT rDst; rDst.top = 0; rDst.left = 0; rDst.right = 96; rDst.bottom = 96; pgrseg->DrawText(0, pgrfx, rSrc, rDst, &dxWidth); delete pgrseg; delete pgrtext; delete pchrp; delete pgrfx; //dtor cleans up font //EndPaint(hWnd, &ps); //cleans up dc return 0; } --- NEW FILE: grfreetype.cpp --- //#include "ft2build.h" //#include FT_FREETYPE_H //#include FT_TYPES_H //#include FT_TRUETYPE_TABLES_H #include "grfreetype.h" #include <stdlib.h> //#include <wx/log.h> static FT_UInt get_glyph_index(FTFont *font, UINT glyph) { if(font->charset == SYMBOL_CHARSET && glyph < 0x100) glyph = glyph + 0xf000; return FT_Get_Char_Index(font->ft_face, glyph); } static void FTVectorToPOINTFX(FT_Vector *vec, POINTFX *pt) { pt->x.value = vec->x >> 6; pt->x.fract = (vec->x & 0x3f) << 10; pt->x.fract |= ((pt->x.fract >> 6) | (pt->x.fract >> 12)); pt->y.value = vec->y >> 6; pt->y.fract = (vec->y & 0x3f) << 10; pt->y.fract |= ((pt->y.fract >> 6) | (pt->y.fract >> 12)); return; } /************************************************************* * WineEngGetFontData * */ DWORD ftGetFontData(FTFont *font, DWORD table, DWORD offset, unsigned char *buf, DWORD cbData) { FT_Face ft_face = font->ft_face; TT_Face tt_face; SFNT_Interface *sfnt; DWORD len; FT_Error err; /* FT_Library library; * handle to library * err = FT_Init_FreeType( &library ); if ( err ) { return GDI_ERROR; } // return ERROR condition err = FT_New_Face( library, "SILDoulos PigLatinDemo", 0, &ft_face ); if ( err ) { return GDI_ERROR; } // return ERROR condition */ //TRACE("font=%p, table=%08lx, offset=%08lx, buf=%p, cbData=%lx\n", //font, table, offset, buf, cbData); if(!FT_IS_SFNT(ft_face)) { //return GDI_ERROR; return GDI_ERROR; // return ERROR condition } tt_face = (TT_Face) ft_face; sfnt = (SFNT_Interface*)tt_face->sfnt; if(!buf || !cbData) len = 0; else len = cbData; if(table) { /* MS tags differ in endidness from FT ones */ table = table >> 24 | table << 24 | (table >> 8 & 0xff00) | (table << 8 & 0xff0000); } err = sfnt->load_any(tt_face, table, offset, buf, &len); if(err) { //TRACE("Can't find table %08lx.\n", table); //return GDI_ERROR; return GDI_ERROR; // return ERROR condition } return len; } // All we want is Ascent, Descent, Height and InternalLeading bool ftGetTextMetrics(FTFont *font, LPftTEXTMETRICW ptm) { FT_Face ft_face = font->ft_face; TT_OS2 *pOS2; TT_HoriHeader *pHori; FT_Fixed x_scale, y_scale; char debugstring[256]; //wxLogTrace(wxT("ftGetTextMetrics")); //TRACE("font=%p, ptm=%p\n", font, ptm); //x_scale = 0x10000; x_scale = ft_face->size->metrics.x_scale; sprintf(debugstring, "ftGetTextMetrics xscale %d\n", x_scale); //OutputDebugString(debugstring); //y_scale = 0x10000; y_scale = ft_face->size->metrics.y_scale; sprintf(debugstring, "ftGetTextMetrics yscale %d\n", y_scale); //OutputDebugString(debugstring); pOS2 = (TT_OS2 *) FT_Get_Sfnt_Table(ft_face, ft_sfnt_os2); if(!pOS2) { //wxLogTrace(wxT("ftGetTextMetrics: Can't find OS/2 table - not TT font?")); //FIXME("Can't find OS/2 table - not TT font?\n"); return 0; } pHori = (TT_HoriHeader *) FT_Get_Sfnt_Table(ft_face, ft_sfnt_hhea); if(!pHori) { //wxLogTrace(wxT("ftGetTextMetrics: Can't find HHEA table - not TT font?")); //FIXME("Can't find HHEA table - not TT font?\n"); return 0; } /*TRACE("OS/2 winA = %d winD = %d typoA = %d typoD = %d typoLG = %d FT_Face a = %d, d = %d, h = %d: HORZ a = %d, d = %d lg = %d maxY = %ld minY = %ld\n", pOS2->usWinAscent, pOS2->usWinDescent, pOS2->sTypoAscender, pOS2->sTypoDescender, pOS2->sTypoLineGap, ft_face->ascender, ft_face->descender, ft_face->height, pHori->Ascender, pHori->Descender, pHori->Line_Gap, ft_face->bbox.yMax, ft_face->bbox.yMin);*/ /*if(font->yMax) { ptm->tmAscent = font->yMax; ptm->tmDescent = -font->yMin; ptm->tmInternalLeading = (ptm->tmAscent + ptm->tmDescent) - ft_face->size->metrics.y_ppem; } else { */ // Hope this is the way it should be ptm->tmAscent = (FT_MulFix(pOS2->usWinAscent, y_scale) + 32) >> 6; sprintf(debugstring, "ftGetTextMetrics pOS2ascent %d ascent %d\n", pOS2->usWinAscent, ptm->tmAscent); //OutputDebugString(debugstring); sprintf(debugstring, "ftGetTextMetrics mulfixres %d\n", FT_MulFix(pOS2->usWinAscent, y_scale)); //OutputDebugString(debugstring); ptm->tmDescent = (FT_MulFix(pOS2->usWinDescent, y_scale) + 32) >> 6; sprintf(debugstring, "ftGetTextMetrics pOS2descent %d descent %d\n", pOS2->usWinDescent, ptm->tmDescent); //OutputDebugString(debugstring); ptm->tmInternalLeading = (FT_MulFix(pOS2->usWinAscent + pOS2->usWinDescent - ft_face->units_per_EM, y_scale) + 32) >> 6; //wxLogTrace("ftGetTextMetrics internalleading %d", ptm->tmInternalLeading); //} ptm->tmHeight = ptm->tmAscent + ptm->tmDescent; // All we want is Ascent, Descent, Height and InternalLeading /* / MSDN says: el = MAX(0, LineGap - ((WinAscent + WinDescent) - (Ascender - Descender))) / ptm->tmExternalLeading = __max(0, (FT_MulFix(pHori->Line_Gap - ((pOS2->usWinAscent + pOS2->usWinDescent) - (pHori->Ascender - pHori->Descender)), y_scale) + 32) >> 6); ptm->tmAveCharWidth = (FT_MulFix(pOS2->xAvgCharWidth, x_scale) + 32) >> 6; ptm->tmMaxCharWidth = (FT_MulFix(ft_face->bbox.xMax - ft_face->bbox.xMin, x_scale) + 32) >> 6; //ptm->tmWeight = font->fake_bold ? FW_BOLD : pOS2->usWeightClass; // !!!fake_bold ptm->tmOverhang = 0; ptm->tmDigitizedAspectX = 300; ptm->tmDigitizedAspectY = 300; ptm->tmFirstChar = pOS2->usFirstCharIndex; ptm->tmLastChar = pOS2->usLastCharIndex; ptm->tmDefaultChar = pOS2->usDefaultChar; ptm->tmBreakChar = pOS2->usBreakChar; //ptm->tmItalic = font->fake_italic ? 255 : ((ft_face->style_flags & FT_STYLE_FLAG_ITALIC) ? 255 : 0); // !!! fake_italic ptm->tmUnderlined = 0; / entry in OS2 table / ptm->tmStruckOut = 0; / entry in OS2 table / / Yes this is correct; braindead api / ptm->tmPitchAndFamily = FT_IS_FIXED_WIDTH(ft_face) ? 0 : TMPF_FIXED_PITCH; if(FT_IS_SCALABLE(ft_face)) ptm->tmPitchAndFamily |= TMPF_VECTOR; if(FT_IS_SFNT(ft_face)) ptm->tmPitchAndFamily |= TMPF_TRUETYPE; if (ptm->tmPitchAndFamily & TMPF_FIXED_PITCH) ptm->tmPitchAndFamily |= FF_ROMAN; else ptm->tmPitchAndFamily |= FF_MODERN; ptm->tmCharSet = font->charset; */ return TRUE; } DWORD ftGetGlyphOutline2(FTFont *font, UINT glyph, UINT format, LPftGLYPHMETRICS lpgm, DWORD buflen, LPVOID buf) { FT_Error err; FT_UInt glyph_index; FT_Face ft_face = font->ft_face; TT_Face tt_face; tt_face = reinterpret_cast<TT_Face>(ft_face); FT_BBox bbox; if(format & GGO_GLYPH_INDEX) { glyph_index = glyph; format &= ~GGO_GLYPH_INDEX; } else glyph_index = get_glyph_index(font, glyph); if(format == GGO_METRICS && font->gmmap.find(glyph_index)!=font->gmmap.end()) { memcpy(lpgm, &((*(font->gmmap.find(glyph_index))).second.gm), sizeof(*lpgm)); return 1; // FIXME } err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_DEFAULT); //err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_NO_AUTOHINT); //err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_NO_SCALE|FT_LOAD_LINEAR_DESIGN); if(err) { return GDI_ERROR; //return GDI_ERROR; } char debugstring[256]; FT_Outline_Get_CBox( &ft_face->glyph->outline, &bbox ); lpgm->gmBlackBoxX = (bbox.xMax - bbox.xMin + 32) >> 6; lpgm->gmBlackBoxY = (bbox.yMax - bbox.yMin + 32) >> 6; // lpgm->gmBlackBoxX = (bbox.xMax - bbox.xMin + 16) >> 5; // lpgm->gmBlackBoxY = (bbox.yMax - bbox.yMin + 16) >> 5; lpgm->gmptGlyphOrigin.x = (bbox.xMin ) >> 6; lpgm->gmptGlyphOrigin.y = bbox.yMax >> 6; // lpgm->gmptGlyphOrigin.x = (bbox.xMin + 16) >> 5; // lpgm->gmptGlyphOrigin.y = (bbox.yMax + 16) >> 5; lpgm->gmCellIncX = (ft_face->glyph->metrics.horiAdvance + 32) >> 6; // lpgm->gmCellIncX = (ft_face->glyph->metrics.horiAdvance + 16) >> 5; sprintf(debugstring, "BlackBoxX %d:%d BlackBoxY %d:%d\n", lpgm->gmBlackBoxX, bbox.xMax - bbox.xMin, lpgm->gmBlackBoxY, bbox.yMax - bbox.yMin); OutputDebugString(debugstring); sprintf(debugstring, "GlyphOriginX %d GlyphOriginY %d\n", lpgm->gmptGlyphOrigin.x, lpgm->gmptGlyphOrigin.y); OutputDebugString(debugstring); return 0; } DWORD ftGetGlyphOutline(FTFont *font, UINT glyph, UINT format, LPftGLYPHMETRICS lpgm, DWORD buflen, LPVOID buf /*, const MAT2* lpmat*/) { FT_Face ft_face = font->ft_face; FT_UInt glyph_index; //DWORD width, height, pitch, needed = 0; DWORD needed = 0; //FT_Bitmap ft_bitmap; FT_Error err; INT left, right, top = 0, bottom = 0; FT_Angle angle = 0; GM tmpgm; //TRACE("%p, %04x, %08x, %p, %08lx, %p, %p\n", font, glyph, format, lpgm, // buflen, buf, lpmat); if(format & GGO_GLYPH_INDEX) { glyph_index = glyph; format &= ~GGO_GLYPH_INDEX; } else glyph_index = get_glyph_index(font, glyph); //if(glyph_index >= font->gmsize) { //font->gmsize = (glyph_index / INIT_GM_SIZE + 1) * INIT_GM_SIZE; //font->gm = (GM *) HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, font->gm, // font->gmsize * sizeof(*font->gm)); // USE STL vector (or SIL Vector) instead since we are using c++ //tmpgm = new GM(); //font->gmmap.insert(GMmap::value_type(glyph_index, tmpgm)); //} else { if(format == GGO_METRICS && font->gmmap.find(glyph_index)!=font->gmmap.end()) { //memcpy(lpgm, &font->gm[glyph_index].gm, sizeof(*lpgm)); memcpy(lpgm, &((*(font->gmmap.find(glyph_index))).second.gm), sizeof(*lpgm)); //tmpgm = (*(font->gmmap.find(glyph_index))).second; return 1; // FIXME } //} err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_DEFAULT); //err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_NO_AUTOHINT|FT_LOAD_IGNORE_TRANSFORM|FT_LOAD_NO_HINTING); //err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_NO_AUTOHINT|FT_LOAD_IGNORE_TRANSFORM); //err = FT_Load_Glyph(ft_face, glyph_index, FT_LOAD_NO_AUTOHINT); if(err) { //FIXME("FT_Load_Glyph on index %x returns %d\n", glyph_index, err); return GDI_ERROR; //return GDI_ERROR; } char debugstring[256]; /* int test = ft_face->glyph->metrics.horiAdvance + 63; sprintf(debugstring, "test0 %d test1 %d test2 %d test3 %d test4 %d test5 %d test6 %d\n", test, test >> 1, test >> 2, test >> 3, test >> 4, test >> 5, test >> 6); OutputDebugString(debugstring); test = ft_face->glyph->metrics.horiAdvance; sprintf(debugstring, "test0 %d test1 %d test2 %d test3 %d test4 %d test5 %d test6 %d\n", test, test >> 1, test >> 2, test >> 3, test >> 4, test >> 5, test >> 6); OutputDebugString(debugstring); test = 63; sprintf(debugstring, "test0 %d test1 %d test2 %d test3 %d test4 %d test5 %d test6 %d\n", test, test >> 1, test >> 2, test >> 3, test >> 4, test >> 5, test >> 6); OutputDebugString(debugstring); */ left = ft_face->glyph->metrics.horiBearingX & -64; sprintf(debugstring, "horiBearingX %d left %d\n", ft_face->glyph->metrics.horiBearingX, left); OutputDebugString(debugstring); right = ((ft_face->glyph->metrics.horiBearingX + ft_face->glyph->metrics.width) + 63) & -64; sprintf(debugstring, "width %d right %d\n", ft_face->glyph->metrics.width, right); OutputDebugString(debugstring); //font->gm[glyph_index].adv = (ft_face->glyph->metrics.horiAdvance + 63) >> 6; //font->gm[glyph_index].lsb = left >> 6; //font->gm[glyph_index].bbx = (right - left) >> 6; //tmpgm.adv = (ft_face->glyph->metrics.horiAdvance + 63) >> 6 ; tmpgm.adv = ((ft_face->glyph->metrics.horiAdvance + 63) & -64) >> 6 ; /*if (left > 0) { tmpgm.adv = (ft_face->glyph->metrics.horiAdvance + left + 63) >> 6 ; } else { tmpgm.adv = (ft_face->glyph->metrics.horiAdvance + 63) >> 6 ; } */ tmpgm.lsb = left >> 6; tmpgm.bbx = (right - left) >> 6; sprintf(debugstring, "adv %d lsb %d bbx %d horiadv %d\n", tmpgm.adv, tmpgm.lsb, tmpgm.bbx, ft_face->glyph->metrics.horiAdvance); OutputDebugString(debugstring); if(font->orientation == 0) { sprintf(debugstring, "orientation 0\n"); //OutputDebugString(debugstring); top = (ft_face->glyph->metrics.horiBearingY + 63) & -64; bottom = (ft_face->glyph->metrics.horiBearingY - ft_face->glyph->metrics.height) & -64; //lpgm->gmCellIncX = font->gm[glyph_index].adv; lpgm->gmCellIncX = tmpgm.adv; lpgm->gmCellIncY = 0; } else { sprintf(debugstring, "orientation other\n"); //OutputDebugString(debugstring); INT xc, yc; FT_Vector vec; angle = font->orientation / 10 << 16; angle |= ((font->orientation % 10) * (1 << 16)) / 10; //TRACE("angle %ld\n", angle >> 16); for(xc = 0; xc < 2; xc++) { for(yc = 0; yc < 2; yc++) { vec.x = ft_face->glyph->metrics.horiBearingX + xc * ft_face->glyph->metrics.width; vec.y = ft_face->glyph->metrics.horiBearingY - yc * ft_face->glyph->metrics.height; //TRACE("Vec %ld,%ld\n", vec.x, vec.y); FT_Vector_Rotate(&vec, angle); if(xc == 0 && yc == 0) { left = right = vec.x; top = bottom = vec.y; } else { if(vec.x < left) left = vec.x; else if(vec.x > right) right = vec.x; if(vec.y < bottom) bottom = vec.y; else if(vec.y > top) top = vec.y; } } } left = left & -64; right = (right + 63) & -64; bottom = bottom & -64; top = (top + 63) & -64; sprintf(debugstring, "transformed box: (%d,%d - %d,%d)\n", left, top, right, bottom); OutputDebugString(debugstring); vec.x = ft_face->glyph->metrics.horiAdvance; vec.y = 0; FT_Vector_Rotate(&vec, angle); lpgm->gmCellIncX = (vec.x+63) >> 6; lpgm->gmCellIncY = -(vec.y+63) >> 6; } //lpgm->gmBlackBoxX = (right - left) >> 6; lpgm->gmBlackBoxX = (ft_face->glyph->metrics.width & -64) >> 6; sprintf(debugstring, "right %d left %d BlackBoxX %d\n", right, left, lpgm->gmBlackBoxX); //OutputDebugString(debugstring); //lpgm->gmBlackBoxY = (top - bottom) >> 6; lpgm->gmBlackBoxY = (ft_face->glyph->metrics.height & -64) >> 6; sprintf(debugstring, "top %d bottom %d BlackBoxY %d\n", top, bottom, lpgm->gmBlackBoxY); //OutputDebugString(debugstring); lpgm->gmptGlyphOrigin.x = left >> 6; lpgm->gmptGlyphOrigin.y = top >> 6; //memcpy(&font->gm[glyph_index].gm, lpgm, sizeof(*lpgm)); //font->gm[glyph_index].init = TRUE; memcpy(&tmpgm.gm, lpgm, sizeof(*lpgm)); tmpgm.init = TRUE; font->gmmap.insert(GMmap::value_type(glyph_index, tmpgm)); if(format == GGO_METRICS) return 1; /* FIXME */ if(ft_face->glyph->format != ft_glyph_format_outline) { //FIXME("loaded a bitmap\n"); return GDI_ERROR; //return GDI_ERROR; } switch(format) { /* case GGO_BITMAP: width = lpgm->gmBlackBoxX; height = lpgm->gmBlackBoxY; pitch = (width + 31) / 32 * 4; needed = pitch * height; if(!buf || !buflen) break; ft_bitmap.width = width; ft_bitmap.rows = height; ft_bitmap.pitch = pitch; ft_bitmap.pixel_mode = ft_pixel_mode_mono; ft_bitmap.buffer = (unsigned char *) buf; if(font->orientation) { FT_Matrix matrix; matrix.xx = matrix.yy = FT_Cos(angle); matrix.xy = -FT_Sin(angle); matrix.yx = -matrix.xy; FT_Outline_Transform(&ft_face->glyph->outline, &matrix); } FT_Outline_Translate(&ft_face->glyph->outline, -left, -bottom ); / Note: FreeType will only set 'black' bits for us. / memset(buf, 0, needed); FT_Outline_Get_Bitmap(library, &ft_face->glyph->outline, &ft_bitmap); break; case GGO_GRAY2_BITMAP: case GGO_GRAY4_BITMAP: case GGO_GRAY8_BITMAP: case WINE_GGO_GRAY16_BITMAP: { unsigned int mult, row, col; BYTE *start, *ptr; width = lpgm->gmBlackBoxX; height = lpgm->gmBlackBoxY; pitch = (width + 3) / 4 * 4; needed = pitch * height; if(!buf || !buflen) break; ft_bitmap.width = width; ft_bitmap.rows = height; ft_bitmap.pitch = pitch; ft_bitmap.pixel_mode = ft_pixel_mode_grays; ft_bitmap.buffer = (unsigned char *)buf; if(font->orientation) { FT_Matrix matrix; matrix.xx = matrix.yy = FT_Cos(angle); matrix.xy = -FT_Sin(angle); matrix.yx = -matrix.xy; FT_Outline_Transform(&ft_face->glyph->outline, &matrix); } FT_Outline_Translate(&ft_face->glyph->outline, -left, -bottom ); FT_Outline_Get_Bitmap(library, &ft_face->glyph->outline, &ft_bitmap); if(format == GGO_GRAY2_BITMAP) mult = 5; else if(format == GGO_GRAY4_BITMAP) mult = 17; else if(format == GGO_GRAY8_BITMAP) mult = 65; else if(format == WINE_GGO_GRAY16_BITMAP) break; else { assert(0); break; } start = (char *)buf; for(row = 0; row < height; row++) { ptr = start; for(col = 0; col < width; col++, ptr++) { *ptr = (*(unsigned int*)ptr * mult + 128) / 256; } start += pitch; } break; } */ case GGO_NATIVE: { int contour, point = 0, first_pt; FT_Outline *outline = &ft_face->glyph->outline; TTPOLYGONHEADER *pph; TTPOLYCURVE *ppc; DWORD pph_start, cpfx, type; if(buflen == 0) buf = NULL; for(contour = 0; contour < outline->n_contours; contour++) { pph_start = needed; pph = (TTPOLYGONHEADER *)(buf) + needed; first_pt = point; if(buf) { pph->dwType = TT_POLYGON_TYPE; FTVectorToPOINTFX(&outline->points[point], &pph->pfxStart); } needed += sizeof(*pph); point++; while(point <= outline->contours[contour]) { ppc = (TTPOLYCURVE *)(buf) + needed; type = (outline->tags[point] == FT_Curve_Tag_On) ? TT_PRIM_LINE : TT_PRIM_QSPLINE; cpfx = 0; do { if(buf) FTVectorToPOINTFX(&outline->points[point], &ppc->apfx[cpfx]); cpfx++; point++; } while(point <= outline->contours[contour] && outline->tags[point] == outline->tags[point-1]); /* At the end of a contour Windows adds the start point */ if(point > outline->contours[contour]) { if(buf) FTVectorToPOINTFX(&outline->points[first_pt], &ppc->apfx[cpfx]); cpfx++; } else if(outline->tags[point] == FT_Curve_Tag_On) { /* add closing pt for bezier */ if(buf) FTVectorToPOINTFX(&outline->points[point], &ppc->apfx[cpfx]); cpfx++; point++; } if(buf) { ppc->wType = type; ppc->cpfx = cpfx; } needed += sizeof(*ppc) + (cpfx - 1) * sizeof(POINTFX); } if(buf) pph->cb = needed - pph_start; } break; } default: //FIXME("Unsupported format %d\n", format); return GDI_ERROR; //return GDI_ERROR; } return needed; } --- NEW FILE: grfreetype.h --- #ifndef GRFREETYPE_INCLUDED #define GRFREETYPE_INCLUDED #include <freetype/freetype.h> #include <freetype/tttables.h> #include <freetype/fttrigon.h> #include <freetype/ftoutln.h> #include <freetype/internal/sfnt.h> #include <stdlib.h> #include "GrCommon.h" //#include <UtilVector.h> //#include <map> //#include <vector> #ifdef _MSC_VER #pragma warning(disable: 4786) // identifier truncated in debug info. #include <windows.h> #else #define GDI_ERROR 255 #define GGO_METRICS 0 #define GGO_BITMAP 1 #define GGO_NATIVE 2 #define GGO_BEZIER 3 #define GGO_GRAY2_BITMAP 4 #define GGO_GRAY4_BITMAP 5 #define GGO_GRAY8_BITMAP 6 #define GGO_GLYPH_INDEX 0x80 #define TT_AVAILABLE 0x0001 #define TT_ENABLED 0x0002 #define TT_PRIM_LINE 1 #define TT_PRIM_QSPLINE 2 #define TT_PRIM_CSPLINE 3 #define TT_POLYGON_TYPE 24 //typedef char BYTE; typedef unsigned short BCHAR; typedef long LONG; //typedef int WORD; typedef unsigned long DWORD; typedef void *LPVOID; #define SYMBOL_CHARSET (BYTE)2 /* typedef struct _FIXED { // fix WORD fract; short value; } FIXED; */ typedef struct tagPOINTFX { // ptfx FIXED x; FIXED y; } POINTFX; typedef struct tagTTPOLYCURVE { WORD wType; WORD cpfx; POINTFX apfx[1]; } TTPOLYCURVE, *LPTTPOLYCURVE; typedef struct tagTTPOLYGONHEADER { DWORD cb; DWORD dwType; POINTFX pfxStart; } TTPOLYGONHEADER, *LPTTPOLYGONHEADER; typedef struct _MAT2 { // mt2 FIXED eM11; FIXED eM12; FIXED eM21; FIXED eM22; } MAT2; /* typedef struct tagPOINT { LONG x; LONG y; } POINT; */ typedef int INT; #include <iostream> #define OutputDebugString(x) std::cout << x #endif #include <map> #define INIT_GM_SIZE 128 typedef unsigned int UINT; typedef struct tagftTEXTMETRIC { // tm long tmHeight; long tmAscent; long tmDescent; long tmInternalLeading; long tmExternalLeading; //long tmAveCharWidth; //long tmMaxCharWidth; //long tmWeight; //long tmOverhang; //long tmDigitizedAspectX; //long tmDigitizedAspectY; //BCHAR tmFirstChar; //BCHAR tmLastChar; //BCHAR tmDefaultChar; //BCHAR tmBreakChar; //BYTE tmItalic; //BYTE tmUnderlined; //BYTE tmStruckOut; //BYTE tmPitchAndFamily; //BYTE tmCharSet; } ftTEXTMETRIC; typedef ftTEXTMETRIC *LPftTEXTMETRICW; typedef struct _ftGLYPHMETRICS { // glmt UINT gmBlackBoxX; UINT gmBlackBoxY; POINT gmptGlyphOrigin; short gmCellIncX; short gmCellIncY; } ftGLYPHMETRICS; typedef ftGLYPHMETRICS *LPftGLYPHMETRICS; typedef struct { ftGLYPHMETRICS gm; INT adv; /* These three hold to widths of the unrotated chars */ INT lsb; INT bbx; bool init; } GM; typedef std::map < int, GM>GMmap; //typedef map<GM *> GMMap; //typedef std::vector<GM> GMVector; typedef struct tagFTFont { // tm FT_Face ft_face; int charset; int orientation; GMmap gmmap; //Vector<GM *> gmvec; DWORD gmsize; ftTEXTMETRIC tm; } FTFont; typedef FTFont *LPFTFont; static FT_UInt get_glyph_index(FTFont *font, UINT glyph); static void FTVectorToPOINTFX(FT_Vector *vec, POINTFX *pt); DWORD ftGetFontData(FTFont *font, DWORD table, DWORD offset, unsigned char *buf, DWORD cbData); bool ftGetTextMetrics(FTFont *font, LPftTEXTMETRICW ptm); DWORD ftGetGlyphOutline(FTFont *font, UINT glyph, UINT format, LPftGLYPHMETRICS lpgm, DWORD buflen, LPVOID buf /*, const MAT2* lpmat*/); DWORD ftGetGlyphOutline2(FTFont *font, UINT glyph, UINT format, LPftGLYPHMETRICS lpgm, DWORD buflen, LPVOID buf /*, const MAT2* lpmat*/); #endif --- NEW FILE: testtext.txt --- Hello World!!! |
From: <sil...@li...> - 2003-03-29 13:44:03
|
Update of /cvsroot/silgraphite/silgraphite/contrib/freetype In directory sc8-pr-cvs1:/tmp/cvs-serv12293/freetype Log Message: Directory /cvsroot/silgraphite/silgraphite/contrib/freetype added to the repository |