1
/*--------------------------------------------------------------------------
3
----- Author: Rainer Menzner (Rainer.Menzner@web.de)
5
----- Description: This file is part of the t1-library. It contains
6
functions for giving free previously allocated
7
memory areas and similar things.
8
----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002.
9
As of version 0.5, t1lib is distributed under the
10
GNU General Public Library Lincense. The
11
conditions can be found in the files LICENSE and
12
LGPL, which should reside in the toplevel
13
directory of the distribution. Please note that
14
there are parts of t1lib that are subject to
16
The parseAFM-package is copyrighted by Adobe Systems
18
The type1 rasterizer is copyrighted by IBM and the
20
----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-)
21
----- Credits: I want to thank IBM and the X11-consortium for making
22
their rasterizer freely available.
23
Also thanks to Piet Tutelaers for his ps2pk, from
24
which I took the rasterizer sources in a format
26
Thanks to all people who make free software living!
27
--------------------------------------------------------------------------*/
33
#include <sys/types.h>
38
# include <sys/types.h>
39
# include <sys/stat.h>
47
#include "../type1/types.h"
49
#include "../type1/objects.h"
50
#include "../type1/spaces.h"
51
#include "../type1/util.h"
52
#include "../type1/fontfcn.h"
63
/* T1_DeleteSize(): Gives back all the memory allocated for size to the
64
system. If size is somewhere in the middle of a linked list of sizes,
65
it further takes care that the remaining list is linked in a proper
66
way. Function returns 0 if successful and otherwise -1*/
67
int T1_DeleteSize( int FontID, float size)
70
FONTSIZEDEPS *ptr, *next_ptr, *prev_ptr;
73
int level[4]={0,T1_AA_NONE,T1_AA_LOW,T1_AA_HIGH};
78
/* Check if size exists; if not, return 1 */
79
if ((ptr=T1int_QueryFontSize( FontID, size, antialias))!=NULL){
80
/* We have to remove a size-> */
82
/* Get pointers to structure which is before/after the structure
83
to be deleted in the linked list and properly relink
85
next_ptr=((FONTSIZEDEPS *)ptr)->pNextFontSizeDeps;
86
prev_ptr=((FONTSIZEDEPS *)ptr)->pPrevFontSizeDeps;
88
if ((prev_ptr==NULL)&&(next_ptr==NULL)){
89
/* There's only one single size, no relink is necessary
90
=> reset the initial pointer to indicate that no size
91
dependent data is available */
92
pFontBase->pFontArray[FontID].pFontSizeDeps=NULL;
96
/* We are at the first size of the linked list and
97
there are still some sizes left after removing the
99
prev_ptr->pNextFontSizeDeps=next_ptr;
101
pFontBase->pFontArray[FontID].pFontSizeDeps=next_ptr;
103
/* We are at the end of an list of at least two sizes: */
104
next_ptr->pPrevFontSizeDeps=prev_ptr;
107
/* Now, that the list is properly linked, free the memory used by size: */
108
/* Free the bitmaps memory: */
109
for (i=0; i<256; i++)
110
if (ptr->pFontCache[i].bits)
111
free(ptr->pFontCache[i].bits);
113
/* Free memory for glyphs: */
114
free(ptr->pFontCache);
115
/* Free the structure itself: */
118
sprintf( err_warn_msg_buf, "Size %f deleted for FontID %d (antialias=%d)",
119
size, FontID, antialias);
120
T1_PrintLog( "T1_DeleteSize()", err_warn_msg_buf, T1LOG_STATISTIC);
124
/* Return the appropriate value */
133
/* T1_DeleteAllSizes(): Gives back all the memory allocated for all sizes
134
to the system. Function returns the number of removed sizes or -1 if an
136
int T1_DeleteAllSizes( int FontID)
143
if (T1_CheckForFontID(FontID)!=1)
146
/* Start deleting at the end of the linked list: */
148
if ((ptr=T1int_GetLastFontSize( FontID))==NULL){
149
/* There has not been any size dependent data: */
153
while (((ptr=T1int_GetLastFontSize(FontID)) != NULL)){
155
T1_DeleteSize( FontID, currsize);
164
/* T1_FreeGlyph(): Gives the memory used by a glyph back to the system. */
165
int T1_FreeGlyph( GLYPH *glyph)
168
if (glyph->bits!=NULL) {
177
/* T1_FreeCompCharData(): Return emory used by a composite character
178
data information structure to the system */
179
int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci)
183
if (cci->pieces!=NULL) {
192
/* T1_DeleteFont(): Gives all memory used by a font back to the system.
193
If the font is successfully deinstalled 0 is returned. A positive value
194
indicates an error. */
195
int T1_DeleteFont( int FontID)
201
if (T1_CheckForFontID(FontID)==-1){ /* Invalid ID */
202
T1_errno=T1ERR_INVALID_FONTID;
206
if (T1_CheckForFontID(FontID)==0) /* Font is not loaded */
209
/* Memory freeing must be done hierachical, start with size dependent
211
result=T1_DeleteAllSizes(FontID);
213
/* Next we delete the AFM-mapping tables */
214
if (pFontBase->pFontArray[FontID].pEncMap!=NULL)
215
free( pFontBase->pFontArray[FontID].pEncMap);
216
if (pFontBase->pFontArray[FontID].pKernMap!=NULL)
217
free( pFontBase->pFontArray[FontID].pKernMap);
219
/* We do not touch the file name because this is only to be done by
222
/* The Type-1 area and tyhe AFM-area may only be free'ed, if the
223
font is a "physical" font and if its reference counter is 1, or
224
if it is a logical font. Otherwise, other logical font use this
225
physical one and it may not be free'ed. In this case, return the
226
number of logical fonts which refer to this physical font. */
227
if ((pFontBase->pFontArray[FontID].physical==1)&&
228
(pFontBase->pFontArray[FontID].refcount==1)){
229
/* Now handle the type 1 data: */
230
if (pFontBase->pFontArray[FontID].pType1Data!=NULL){
231
/* First: VM, which includes CharStrings, Private, .... */
232
free(pFontBase->pFontArray[FontID].vm_base);
233
/* .. then the struct itself: */
234
free(pFontBase->pFontArray[FontID].pType1Data);
235
pFontBase->pFontArray[FontID].pType1Data=NULL;
238
/* afm-data is yet there -> */
239
if (pFontBase->pFontArray[FontID].pAFMData!=NULL){
240
result=FreeAFMData(pFontBase->pFontArray[FontID].pAFMData);
241
pFontBase->pFontArray[FontID].pAFMData=NULL;
245
if (pFontBase->pFontArray[FontID].physical==1){
246
/* font is physical and is referred to by other fonts ->
247
Do nothing further and return number of references: */
249
return(pFontBase->pFontArray[FontID].refcount - 1);
253
/* If we get here and the font is logical, we have to
254
decrement the refcount of the referred physical font */
255
if (pFontBase->pFontArray[FontID].physical==0){
256
pFontBase->pFontArray[pFontBase->pFontArray[FontID].refcount].refcount--;
260
/* Set remaining area explicitly to 0 (all but pFontFileName and
262
pFontBase->pFontArray[FontID].pAFMData=NULL;
263
pFontBase->pFontArray[FontID].pType1Data=NULL;
264
pFontBase->pFontArray[FontID].pEncMap=NULL;
265
pFontBase->pFontArray[FontID].pKernMap=NULL;
266
pFontBase->pFontArray[FontID].pFontEnc=NULL;
267
pFontBase->pFontArray[FontID].pFontSizeDeps=NULL;
268
pFontBase->pFontArray[FontID].vm_base=NULL;
269
pFontBase->pFontArray[FontID].FontMatrix[0]=0.0;
270
pFontBase->pFontArray[FontID].FontMatrix[1]=0.0;
271
pFontBase->pFontArray[FontID].FontMatrix[2]=0.0;
272
pFontBase->pFontArray[FontID].FontMatrix[3]=0.0;
273
pFontBase->pFontArray[FontID].FontTransform[0]=0.0;
274
pFontBase->pFontArray[FontID].FontTransform[1]=0.0;
275
pFontBase->pFontArray[FontID].FontTransform[2]=0.0;
276
pFontBase->pFontArray[FontID].FontTransform[3]=0.0;
277
pFontBase->pFontArray[FontID].slant=0.0;
278
pFontBase->pFontArray[FontID].extend=0.0;
279
pFontBase->pFontArray[FontID].UndrLnPos=0.0;
280
pFontBase->pFontArray[FontID].UndrLnThick=0.0;
281
pFontBase->pFontArray[FontID].OvrLnPos=0.0;
282
pFontBase->pFontArray[FontID].OvrLnThick=0.0;
283
pFontBase->pFontArray[FontID].OvrStrkPos=0.0;
284
pFontBase->pFontArray[FontID].OvrStrkThick=0.0;
285
pFontBase->pFontArray[FontID].physical=0;
286
pFontBase->pFontArray[FontID].refcount=0;
287
pFontBase->pFontArray[FontID].space_position=0;
288
pFontBase->pFontArray[FontID].info_flags=0;
296
/* FreeAFMData(): Give all memory used by afm-Information back to the
298
int FreeAFMData( FontInfo *pAFMData)
300
if (pAFMData != NULL){
301
if (pAFMData->gfi != NULL){
302
free(pAFMData->gfi->afmVersion); pAFMData->gfi->afmVersion = NULL;
303
free(pAFMData->gfi->fontName); pAFMData->gfi->fontName = NULL;
304
free(pAFMData->gfi->fullName); pAFMData->gfi->fullName = NULL;
305
free(pAFMData->gfi->familyName); pAFMData->gfi->familyName = NULL;
306
free(pAFMData->gfi->weight); pAFMData->gfi->weight = NULL;
307
free(pAFMData->gfi->version); pAFMData->gfi->version = NULL;
308
free(pAFMData->gfi->notice); pAFMData->gfi->notice = NULL;
309
free(pAFMData->gfi->encodingScheme); pAFMData->gfi->encodingScheme = NULL;
310
free(pAFMData->gfi); pAFMData->gfi = NULL;
313
if (pAFMData->cwi != NULL){
314
free(pAFMData->cwi); pAFMData->cwi = NULL;
317
if (pAFMData->cmi != NULL){
319
CharMetricInfo *temp = pAFMData->cmi;
320
Ligature *node = temp->ligs;
321
for (i = 0; i < pAFMData->numOfChars; ++i){
322
for (node = temp->ligs; node != NULL; node = node->next){
323
free(node->succ); node->succ = NULL;
324
free(node->lig); node->lig = NULL;
326
free(temp->name); temp->name = NULL;
329
free(pAFMData->cmi); pAFMData->cmi = NULL;
332
if (pAFMData->tkd != NULL){
333
free(pAFMData->tkd); pAFMData->tkd = NULL;
336
if (pAFMData->pkd != NULL){
338
for (i = 0; i < pAFMData->numOfPairs; ++i){
339
free(pAFMData->pkd[i].name1); pAFMData->pkd[i].name1 = NULL;
340
free(pAFMData->pkd[i].name2); pAFMData->pkd[i].name2 = NULL;
342
free(pAFMData->pkd); pAFMData->pkd = NULL;
345
if (pAFMData->ccd != NULL){
347
CompCharData *ccd = pAFMData->ccd;
348
for (i = 0; i < pAFMData->numOfComps; ++i){
349
for (j = 0; j < ccd[i].numOfPieces; ++j){
350
free(ccd[i].pieces[j].pccName);
351
ccd[i].pieces[j].pccName = NULL;
353
free(ccd[i].ccName); ccd[i].ccName = NULL;
355
free(pAFMData->ccd); pAFMData->ccd = NULL;