diff options
Diffstat (limited to 'Build/source/libs/t1lib/t1delete.c')
-rw-r--r-- | Build/source/libs/t1lib/t1delete.c | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/Build/source/libs/t1lib/t1delete.c b/Build/source/libs/t1lib/t1delete.c new file mode 100644 index 00000000000..fea216b3222 --- /dev/null +++ b/Build/source/libs/t1lib/t1delete.c @@ -0,0 +1,362 @@ +/*-------------------------------------------------------------------------- + ----- File: t1delete.c + ----- Author: Rainer Menzner (Rainer.Menzner@web.de) + ----- Date: 2002-12-02 + ----- Description: This file is part of the t1-library. It contains + functions for giving free previously allocated + memory areas and similar things. + ----- Copyright: t1lib is copyrighted (c) Rainer Menzner, 1996-2002. + As of version 0.5, t1lib is distributed under the + GNU General Public Library Lincense. The + conditions can be found in the files LICENSE and + LGPL, which should reside in the toplevel + directory of the distribution. Please note that + there are parts of t1lib that are subject to + other licenses: + The parseAFM-package is copyrighted by Adobe Systems + Inc. + The type1 rasterizer is copyrighted by IBM and the + X11-consortium. + ----- Warranties: Of course, there's NO WARRANTY OF ANY KIND :-) + ----- Credits: I want to thank IBM and the X11-consortium for making + their rasterizer freely available. + Also thanks to Piet Tutelaers for his ps2pk, from + which I took the rasterizer sources in a format + independent from X11. + Thanks to all people who make free software living! +--------------------------------------------------------------------------*/ + +#define T1DELETE_C + + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#if defined(_MSC_VER) +# include <io.h> +# include <sys/types.h> +# include <sys/stat.h> +#else +# include <unistd.h> +#endif +#include <stdlib.h> +#include <math.h> + + +#include "../type1/types.h" +#include "parseAFM.h" +#include "../type1/objects.h" +#include "../type1/spaces.h" +#include "../type1/util.h" +#include "../type1/fontfcn.h" + +#include "t1types.h" +#include "t1extern.h" +#include "t1delete.h" +#include "t1load.h" +#include "t1finfo.h" +#include "t1base.h" + + + +/* T1_DeleteSize(): Gives back all the memory allocated for size to the + system. If size is somewhere in the middle of a linked list of sizes, + it further takes care that the remaining list is linked in a proper + way. Function returns 0 if successful and otherwise -1*/ +int T1_DeleteSize( int FontID, float size) +{ + int i, j; + FONTSIZEDEPS *ptr, *next_ptr, *prev_ptr; + int jobs=0; + int antialias; + int level[4]={0,T1_AA_NONE,T1_AA_LOW,T1_AA_HIGH}; + + + for ( j=0; j<4; j++){ + antialias=level[j]; + /* Check if size exists; if not, return 1 */ + if ((ptr=T1int_QueryFontSize( FontID, size, antialias))!=NULL){ + /* We have to remove a size-> */ + jobs++; + /* Get pointers to structure which is before/after the structure + to be deleted in the linked list and properly relink + structures */ + next_ptr=((FONTSIZEDEPS *)ptr)->pNextFontSizeDeps; + prev_ptr=((FONTSIZEDEPS *)ptr)->pPrevFontSizeDeps; + + if ((prev_ptr==NULL)&&(next_ptr==NULL)){ + /* There's only one single size, no relink is necessary + => reset the initial pointer to indicate that no size + dependent data is available */ + pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; + } + else{ + if (prev_ptr!=NULL) + /* We are at the first size of the linked list and + there are still some sizes left after removing the + current */ + prev_ptr->pNextFontSizeDeps=next_ptr; + else + pFontBase->pFontArray[FontID].pFontSizeDeps=next_ptr; + if (next_ptr!=NULL) + /* We are at the end of an list of at least two sizes: */ + next_ptr->pPrevFontSizeDeps=prev_ptr; + } + + /* Now, that the list is properly linked, free the memory used by size: */ + /* Free the bitmaps memory: */ + for (i=0; i<256; i++) + if (ptr->pFontCache[i].bits) + free(ptr->pFontCache[i].bits); + + /* Free memory for glyphs: */ + free(ptr->pFontCache); + /* Free the structure itself: */ + free(ptr); + /* Print log: */ + sprintf( err_warn_msg_buf, "Size %f deleted for FontID %d (antialias=%d)", + size, FontID, antialias); + T1_PrintLog( "T1_DeleteSize()", err_warn_msg_buf, T1LOG_STATISTIC); + } + } + + /* Return the appropriate value */ + if (jobs==0) + return(-1); + else + return(0); + +} + + +/* T1_DeleteAllSizes(): Gives back all the memory allocated for all sizes + to the system. Function returns the number of removed sizes or -1 if an + error ocurred. */ +int T1_DeleteAllSizes( int FontID) +{ + int sizecount; + float currsize; + + FONTSIZEDEPS *ptr; + + if (T1_CheckForFontID(FontID)!=1) + return(-1); + + /* Start deleting at the end of the linked list: */ + sizecount=0; + if ((ptr=T1int_GetLastFontSize( FontID))==NULL){ + /* There has not been any size dependent data: */ + return(0); + } + + while (((ptr=T1int_GetLastFontSize(FontID)) != NULL)){ + currsize=ptr->size; + T1_DeleteSize( FontID, currsize); + sizecount++; + + } + + return(sizecount); +} + + +/* T1_FreeGlyph(): Gives the memory used by a glyph back to the system. */ +int T1_FreeGlyph( GLYPH *glyph) +{ + if (glyph!=NULL) { + if (glyph->bits!=NULL) { + free(glyph->bits); + } + free(glyph); + } + return(0); +} + + +/* T1_FreeCompCharData(): Return emory used by a composite character + data information structure to the system */ +int T1_FreeCompCharData( T1_COMP_CHAR_INFO *cci) +{ + + if (cci!=NULL) { + if (cci->pieces!=NULL) { + free( cci->pieces); + } + free( cci); + } + return( 0); +} + + +/* T1_DeleteFont(): Gives all memory used by a font back to the system. + If the font is successfully deinstalled 0 is returned. A positive value + indicates an error. */ +int T1_DeleteFont( int FontID) +{ + + int result; + + + if (T1_CheckForFontID(FontID)==-1){ /* Invalid ID */ + T1_errno=T1ERR_INVALID_FONTID; + return(-1); + } + + if (T1_CheckForFontID(FontID)==0) /* Font is not loaded */ + return(0); + + /* Memory freeing must be done hierachical, start with size dependent + data: */ + result=T1_DeleteAllSizes(FontID); + + /* Next we delete the AFM-mapping tables */ + if (pFontBase->pFontArray[FontID].pEncMap!=NULL) + free( pFontBase->pFontArray[FontID].pEncMap); + if (pFontBase->pFontArray[FontID].pKernMap!=NULL) + free( pFontBase->pFontArray[FontID].pKernMap); + + /* We do not touch the file name because this is only to be done by + T1_CloseLib(): */ + + /* The Type-1 area and tyhe AFM-area may only be free'ed, if the + font is a "physical" font and if its reference counter is 1, or + if it is a logical font. Otherwise, other logical font use this + physical one and it may not be free'ed. In this case, return the + number of logical fonts which refer to this physical font. */ + if ((pFontBase->pFontArray[FontID].physical==1)&& + (pFontBase->pFontArray[FontID].refcount==1)){ + /* Now handle the type 1 data: */ + if (pFontBase->pFontArray[FontID].pType1Data!=NULL){ + /* First: VM, which includes CharStrings, Private, .... */ + free(pFontBase->pFontArray[FontID].vm_base); + /* .. then the struct itself: */ + free(pFontBase->pFontArray[FontID].pType1Data); + pFontBase->pFontArray[FontID].pType1Data=NULL; + } + + /* afm-data is yet there -> */ + if (pFontBase->pFontArray[FontID].pAFMData!=NULL){ + result=FreeAFMData(pFontBase->pFontArray[FontID].pAFMData); + pFontBase->pFontArray[FontID].pAFMData=NULL; + } + } + else{ + if (pFontBase->pFontArray[FontID].physical==1){ + /* font is physical and is referred to by other fonts -> + Do nothing further and return number of references: */ + + return(pFontBase->pFontArray[FontID].refcount - 1); + } + } + + /* If we get here and the font is logical, we have to + decrement the refcount of the referred physical font */ + if (pFontBase->pFontArray[FontID].physical==0){ + pFontBase->pFontArray[pFontBase->pFontArray[FontID].refcount].refcount--; + } + + + /* Set remaining area explicitly to 0 (all but pFontFileName and + pAfmFileName!) */ + pFontBase->pFontArray[FontID].pAFMData=NULL; + pFontBase->pFontArray[FontID].pType1Data=NULL; + pFontBase->pFontArray[FontID].pEncMap=NULL; + pFontBase->pFontArray[FontID].pKernMap=NULL; + pFontBase->pFontArray[FontID].pFontEnc=NULL; + pFontBase->pFontArray[FontID].pFontSizeDeps=NULL; + pFontBase->pFontArray[FontID].vm_base=NULL; + pFontBase->pFontArray[FontID].FontMatrix[0]=0.0; + pFontBase->pFontArray[FontID].FontMatrix[1]=0.0; + pFontBase->pFontArray[FontID].FontMatrix[2]=0.0; + pFontBase->pFontArray[FontID].FontMatrix[3]=0.0; + pFontBase->pFontArray[FontID].FontTransform[0]=0.0; + pFontBase->pFontArray[FontID].FontTransform[1]=0.0; + pFontBase->pFontArray[FontID].FontTransform[2]=0.0; + pFontBase->pFontArray[FontID].FontTransform[3]=0.0; + pFontBase->pFontArray[FontID].slant=0.0; + pFontBase->pFontArray[FontID].extend=0.0; + pFontBase->pFontArray[FontID].UndrLnPos=0.0; + pFontBase->pFontArray[FontID].UndrLnThick=0.0; + pFontBase->pFontArray[FontID].OvrLnPos=0.0; + pFontBase->pFontArray[FontID].OvrLnThick=0.0; + pFontBase->pFontArray[FontID].OvrStrkPos=0.0; + pFontBase->pFontArray[FontID].OvrStrkThick=0.0; + pFontBase->pFontArray[FontID].physical=0; + pFontBase->pFontArray[FontID].refcount=0; + pFontBase->pFontArray[FontID].space_position=0; + pFontBase->pFontArray[FontID].info_flags=0; + + return(0); + +} + + + +/* FreeAFMData(): Give all memory used by afm-Information back to the + system. */ +int FreeAFMData( FontInfo *pAFMData) +{ + if (pAFMData != NULL){ + if (pAFMData->gfi != NULL){ + free(pAFMData->gfi->afmVersion); pAFMData->gfi->afmVersion = NULL; + free(pAFMData->gfi->fontName); pAFMData->gfi->fontName = NULL; + free(pAFMData->gfi->fullName); pAFMData->gfi->fullName = NULL; + free(pAFMData->gfi->familyName); pAFMData->gfi->familyName = NULL; + free(pAFMData->gfi->weight); pAFMData->gfi->weight = NULL; + free(pAFMData->gfi->version); pAFMData->gfi->version = NULL; + free(pAFMData->gfi->notice); pAFMData->gfi->notice = NULL; + free(pAFMData->gfi->encodingScheme); pAFMData->gfi->encodingScheme = NULL; + free(pAFMData->gfi); pAFMData->gfi = NULL; + } + + if (pAFMData->cwi != NULL){ + free(pAFMData->cwi); pAFMData->cwi = NULL; + } + + if (pAFMData->cmi != NULL){ + int i = 0; + CharMetricInfo *temp = pAFMData->cmi; + Ligature *node = temp->ligs; + for (i = 0; i < pAFMData->numOfChars; ++i){ + for (node = temp->ligs; node != NULL; node = node->next){ + free(node->succ); node->succ = NULL; + free(node->lig); node->lig = NULL; + } + free(temp->name); temp->name = NULL; + temp++; + } + free(pAFMData->cmi); pAFMData->cmi = NULL; + } + + if (pAFMData->tkd != NULL){ + free(pAFMData->tkd); pAFMData->tkd = NULL; + } + + if (pAFMData->pkd != NULL){ + int i = 0; + for (i = 0; i < pAFMData->numOfPairs; ++i){ + free(pAFMData->pkd[i].name1); pAFMData->pkd[i].name1 = NULL; + free(pAFMData->pkd[i].name2); pAFMData->pkd[i].name2 = NULL; + } + free(pAFMData->pkd); pAFMData->pkd = NULL; + } + + if (pAFMData->ccd != NULL){ + int i = 0, j = 0; + CompCharData *ccd = pAFMData->ccd; + for (i = 0; i < pAFMData->numOfComps; ++i){ + for (j = 0; j < ccd[i].numOfPieces; ++j){ + free(ccd[i].pieces[j].pccName); + ccd[i].pieces[j].pccName = NULL; + } + free(ccd[i].ccName); ccd[i].ccName = NULL; + } + free(pAFMData->ccd); pAFMData->ccd = NULL; + } + free(pAFMData); + } + return(0); + +} + |