diff options
Diffstat (limited to 'Build/source/libs/t1lib/t1subset.c')
-rw-r--r-- | Build/source/libs/t1lib/t1subset.c | 933 |
1 files changed, 0 insertions, 933 deletions
diff --git a/Build/source/libs/t1lib/t1subset.c b/Build/source/libs/t1lib/t1subset.c deleted file mode 100644 index 59d30207d1f..00000000000 --- a/Build/source/libs/t1lib/t1subset.c +++ /dev/null @@ -1,933 +0,0 @@ -/*-------------------------------------------------------------------------- - ----- File: t1subset.c - ----- Author: Rainer Menzner (Rainer.Menzner@web.de) - ----- Date: 2002-12-08 - ----- Description: This file is part of the t1-library. It contains - functions for subsetting type 1 fonts. - ----- 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 T1SUBSET_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 <string.h> - -#include "../type1/ffilest.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 "../type1/regions.h" - - -#include "t1types.h" -#include "t1extern.h" -#include "t1finfo.h" -#include "t1misc.h" -#include "t1base.h" -#include "t1delete.h" -#include "t1subset.h" - -/* Segment header for pfb-files (reminder): - - Segment-header: - - Byte 1: always 128 (0x80) - - Byte 2: 1 = ASCII text - 2 = Binary text - 3 = End of file indicator (EOF) - - Byte 3: least significant byte \ - Byte 4: \ Length of - Byte 5: / data segment in bytes - Byte 6: most significant byte / - - */ -#define SEGMENT_ASCII 1 -#define SEGMENT_BINARY 2 -#define SEGMENT_EOF 3 - - - -static char *charstringP; -static int charstringL; - - -/* We define two lookup tables to make a fast conversion from - binary bytes to ASCII-hex bytes. */ -static unsigned char highHexByte[256]={ - 0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30, - 0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31, - 0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32, - 0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33, - 0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34, - 0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35, - 0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36, - 0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37,0x37, - 0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38, - 0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39,0x39, - 0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41, - 0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42, - 0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43,0x43, - 0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0x44, - 0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45,0x45, - 0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46,0x46 -}; -static unsigned char lowHexByte[256]={ - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46, - 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 -}; - - -/* parameters for eexec encryption */ -static unsigned short int eexec_r; -static unsigned short int eexec_c1=52845; -static unsigned short int eexec_c2=22719; - -/* Eexec-encrption according to the Adobe Black Book */ -static unsigned char EexecEncrypt( unsigned char plain) -{ - - unsigned char cipher; - - cipher = (plain ^ (eexec_r>>8)); - eexec_r = (cipher + eexec_r) * eexec_c1 + eexec_c2; - return( cipher); -} - - - -static int locateCharString( int FontID, char *charname) -{ - - int namelen; - int dictlen; - int i; - psdict *CharStringsP; - - - namelen=strlen( charname); - - CharStringsP=pFontBase->pFontArray[FontID].pType1Data->CharStringsP; - - dictlen=CharStringsP[0].key.len; - for ( i=1; i<=dictlen; i++) { - if (namelen==CharStringsP[i].key.len) { - /* This could be the charstring in question */ - if (strncmp( charname, - CharStringsP[i].key.data.nameP, - namelen)==0) { - /* It is the the desired charstring */ - charstringP=CharStringsP[i].value.data.valueP; - charstringL=CharStringsP[i].value.len; - return( i); - } - } - } - /* charstring not found ??? */ - return( 0); - -} - - - -static int make_pfb_segment_header( char *ptr, int type, unsigned long size) -{ - ptr[0]=(char) 0x80; - ptr[1]=type; - if (type==3) - return( 2); - ptr[2]=(char)(size & 0xFF); - ptr[3]=(char)((size>>8) & 0xFF); - ptr[4]=(char)((size>>16) & 0xFF); - ptr[5]=(char)((size>>24) & 0xFF); - return( 6); -} - - - - -/* A function for reading a Type 1 font file. eexec-decryption - is done on the fly. */ -char *T1_SubsetFont( int FontID, - char *mask, - unsigned int flags, - int linewidth, - unsigned long maxblocksize, - unsigned long *bufsize) -{ - - FILE *ifp; - static char *filebuf=NULL; - unsigned long filesize=0; - int filesegs=0; - - char *outbuf=NULL; - unsigned long outsize=0; - char *encryptbuf=NULL; - unsigned long encryptsize=0; - int encryptsegs=0; - char *trailerbuf=NULL; - unsigned long trailersize=0; - int trailersegs=0; - char linebuf[1025]; - - char *csdone; /* stores which charstrings already have been written */ - int currstring_no=0; - char *charnameP; - unsigned char cipher; - char rdstring[3]; - char ndstring[3]; - - int retval=1; - - /* Indices. Could save a few but debugging becomes easier this way */ - int i=0; - int j=0; - int k=0; - int l=0; - int m=0; - int n=0; - int o=0; - int p=0; - - - int notdefencoded=0; - int stdenc=0; - int reencode=0; - int colcount=0; - int tr_len=-1; - int encrypt=1; /* 1=ASCII-hex, 2=Binary, 0=None (for debugging) */ - int dindex=0; - int nocharstrings=0; - char encmask[256]; /* Mask after resolving composite characters */ - T1_COMP_CHAR_INFO* cci = NULL; - - - /* Otherwise we would get invalid accesses later */ - if (T1_CheckForFontID(FontID)!=1) { - T1_errno=T1ERR_INVALID_FONTID; - return(NULL); - } - - - /* Check parameters */ - if ( (mask==NULL) || (bufsize==NULL) || (linewidth < 8) || - (linewidth > 1024) || (maxblocksize < 4) ) { - T1_errno=T1ERR_INVALID_PARAMETER; - return(NULL); - } - - - /* First, we check how many characters have to find their way into the - subsetted file. We take possibly existing composite character - definitions by the user into account. */ - for ( j=0; j<256; j++) { - if ( mask[j] != 0 ) { - /* check whether addressed character is an internal character of - the font */ - if ( cci != NULL ) - T1_FreeCompCharData( cci); - - cci = T1_GetCompCharData( FontID, j); - - if ( cci != NULL ) { - nocharstrings += cci->numPieces; - } - else { - ++nocharstrings; - } - } - } - - - /* adjust encrypting type according to flags. Default is ASCII-hex - encryption because the output may be verbatim inserted into a - PostScript-file. */ - if (flags & T1_SUBSET_ENCRYPT_BINARY) - encrypt=2; - else if (flags & T1_SUBSET_ENCRYPT_NONE) - encrypt=0; - - /* Open and initialize scanning machinery */ - T1io_reset(); - if ((ifp = (FILE *)T1Open(T1_GetFontFilePath( FontID), "rb"))==NULL) { - T1_errno=T1ERR_FILE_OPEN_ERR; - return(NULL); - } - - if (encrypt==0) - sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, non-encrypted debug output", - FontID, flags); - else if (encrypt==1) - sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, ASCII-hex output with linelength %d", - FontID, flags, linewidth); - else if (encrypt==2) - sprintf( err_warn_msg_buf, "Subsetting Font %d, flags=0x%X, Binary output with maximum blocksize %lu", - FontID, flags, maxblocksize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - - /* Get size of file */ - filesize=T1GetFileSize( ifp); - sprintf( err_warn_msg_buf, "Source file %s is %lu bytes long", - T1_GetFontFilePath( FontID), filesize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - if ((filebuf=(char *)calloc( filesize, sizeof(char)))==NULL) { - T1_errno=T1ERR_ALLOC_MEM; - return( NULL); - } - - while (retval>0) { - /* get a line from the file. We have to read enough characters to - ensure that "eexec" does not get split between two reads. - Otherwise, decryption would not be started. */ - retval=T1Gets(&(filebuf[i]), 1025, ifp); - - i+=retval; - if ( (dindex==0) && (T1GetDecrypt()>0) ) { - dindex=i-retval; /* from this point on we have decrypted bytes */ - sprintf( err_warn_msg_buf, "Human-readable header finished (%d data bytes)", - dindex); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - } - - /* Encoding handling */ - if (strstr( &(filebuf[i-retval]), "/Encoding")!=NULL) { - if (strstr( &(filebuf[i-retval]), "StandardEncoding")!=NULL) { - stdenc=1; - if ((flags & T1_SUBSET_FORCE_REENCODE)!=0) { - /* we ignore the current line ... */ - i-=retval; - /* and put the encoding header into the buffer */ - i+=sprintf( &(filebuf[i]), - "/Encoding 256 array\n0 1 255 {1 index exch /.notdef put} for\n" - ); - reencode=1; - } - else { - T1_PrintLog( "T1_SubsetFont()", "Leaving StandardEncoding untouched", - T1LOG_DEBUG); - reencode=0; - } - } - else { - /* The encoding is explicitly defined in the font file. We skip the - whole definition unless reencoding should be skipped. */ - stdenc=0; - retval=T1Gets(&(filebuf[i]), 1025, ifp); - i+=retval; - while (retval>0) { - /* get a line and check for end of encoding definition. */ - retval=T1Gets(&(filebuf[i]), 1025, ifp); - if ((flags & T1_SUBSET_SKIP_REENCODE)!=0) { /* we store the encoding - defined here */ - i+=retval; - reencode=0; - } - else { - reencode=1; - } - if ( (dindex==0) && (T1GetDecrypt()>0) ) { - dindex=i; /* from this point we have decrypted bytes */ - } - if (strstr( &(filebuf[i-retval]), "readonly def")!=NULL) { - break; - } - } - if (reencode==0) - T1_PrintLog( "T1_SubsetFont()", "Preserving FontSpecific Encoding", - T1LOG_DEBUG); - } - - /* At this point, if required, the actual encoding definition - follows. */ - if ( reencode!=0) { - k=0; - - /* Reset resulting encoding mask */ - for ( j=0; j<256; j++) { - encmask[j] = 0; - } - - /* Resolve composite characters and their components */ - for ( j=0; j<256; j++) { - if (mask[j]!=0) { - if ( cci != NULL) - T1_FreeCompCharData( cci); - cci = T1_GetCompCharData( FontID, j); - if ( (cci != NULL) && (cci->numPieces > 1) ) { - /* Tag all components that are required to construct - the composite character j. */ - for ( p=0; p<cci->numPieces; p++) { - encmask[cci->pieces[p].piece] = 1; - } - } - /* Tag character j in encoding definition */ - encmask[j] = 1; - } - } - - /* Write actually required encoding slots */ - for ( j=0; j<256; j++) { - if (encmask[j]!=0) { - charnameP=T1_GetCharName( FontID, j); - i+=sprintf( &(filebuf[i]), "dup %d /%s put\n", j, - charnameP); - k++; - if (strcmp(charnameP, ".notdef")==0) - notdefencoded=1; - } - } - - /* finish encoding definition */ - i+=sprintf( &(filebuf[i]), "readonly def\n"); - sprintf( err_warn_msg_buf, "Encoded %d characters", - k); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - k=0; - } - - } /* end of if (...encoding handling...) */ - - /* Extract the names are used for the charstring definitions. - We will later need them! */ - if (strstr( &(filebuf[i-retval]), "/RD")!=NULL) { - sprintf( rdstring, "RD"); - } - if (strstr( &(filebuf[i-retval]), "/ND")!=NULL) { - sprintf( ndstring, "ND"); - } - if (strstr( &(filebuf[i-retval]), "/-|")!=NULL) { - sprintf( rdstring, "-|"); - } - if (strstr( &(filebuf[i-retval]), "/|-")!=NULL) { - sprintf( ndstring, "|-"); - } - - if (strstr( &(filebuf[i-retval]), "/CharStrings")!=NULL) { - /* replace dictionary with one of an appropriate size: */ - i -=retval; - sprintf( err_warn_msg_buf, "Private dictionary finished (%u data bytes)", - i-dindex); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - /* if .notdef is not in the encoding mask, we have to reserve - room for the additional charstring .notdef. Note that still - nocharstrings is an upper bound estimation, which is reached - in cases where no characters are encoded more than one time. */ - if (notdefencoded==0) - nocharstrings++; - - i+=sprintf( &(filebuf[i]), "2 index /CharStrings %d dict dup begin\n", - nocharstrings); - break; - } - } /* the portion until Charstrings-dict is now read in */ - - - /* We now have to write the CharStrings. - Each charstring must be written once, even if the respective - character appears more than once in the encoding. So we set up - table to remember which charstrings already have been written. - - Note: The indices returned by locateCharString() range from 1 to n, so that - we have to decrement the index when filling the csdone array! - */ - if (( csdone=(char *)calloc( pFontBase->pFontArray[FontID].pType1Data->CharStringsP[0].key.len, - sizeof(char)))==NULL) { - T1_errno=T1ERR_ALLOC_MEM; - free( filebuf); - T1Close( ifp); - return( NULL); - } - - /* The .notdef character is in force! */ - if ((currstring_no=locateCharString( FontID, ".notdef"))==0) { - T1_errno=T1ERR_UNSPECIFIED; - free( csdone); - T1Close( ifp); - return( NULL); - } - i+=sprintf( &(filebuf[i]), "/.notdef %d %s ", charstringL, rdstring); - memcpy(&(filebuf[i]), charstringP, charstringL); - i+=charstringL; - i+=sprintf( &(filebuf[i]), " %s\n", ndstring); - csdone[currstring_no-1]=1; - /* Now, step through the specifier matrix and write only the - necessary charstrings. */ - for ( j=0; j<256; j++) { - if (mask[j]!=0) { - charnameP=T1_GetCharName( FontID, j); - if ((currstring_no=locateCharString( FontID, charnameP))==0) { - /* This might be a composite character, check and handle this case ... */ - if ( cci != NULL ) - T1_FreeCompCharData( cci); - - cci = T1_GetCompCharData( FontID, j); - if ( (cci != NULL) && (cci->numPieces > 1) ) { - /* composite character, loop through pieces and look for the components */ - for ( p=0; p<cci->numPieces; p++) { - - charnameP=T1_GetCharName( FontID, cci->pieces[p].piece); - if ((currstring_no=locateCharString( FontID, charnameP))==0) { - /* Character component not found. Try next ... */ - T1_PrintLog( "T1_SubsetFont()", "Could not locate component CS ""%s"" for index %d", - T1LOG_WARNING, charnameP, cci->pieces[p].piece); - } - else { - /* Add component to subset and process charstring only if it has not - already been done */ - if (csdone[currstring_no-1]==0) { - k=i; - i+=sprintf( &(filebuf[i]), "/%s %d %s ", charnameP, charstringL, rdstring); - memcpy(&(filebuf[i]), charstringP, charstringL); - i+=charstringL; - i+=sprintf( &(filebuf[i]), " %s\n", ndstring); - csdone[currstring_no-1]=1; - T1_PrintLog( "T1_SubsetFont()", - "Processing of component CS ""%s"" for index %d successful (len=%d bytes, line=%d bytes)", - T1LOG_DEBUG, charnameP, cci->pieces[p].piece, charstringL, i-k); - } - else { - sprintf( err_warn_msg_buf, "Skipped multiple processing of component CS ""%s"" (index %d)", - charnameP, cci->pieces[p].piece); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - } - } - } - continue; - } - else { - /* Character not found and no composite. This is mysterious, but causes no harm - because .notdef will be substituted */ - sprintf( err_warn_msg_buf, "Could not locate CS ""%s"" for index %d", - charnameP, j); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_WARNING); - continue; - } - - } - /* Process charstring only if it has not already been done */ - if (csdone[currstring_no-1]==0) { - k=i; - i+=sprintf( &(filebuf[i]), "/%s %d %s ", charnameP, charstringL, rdstring); - memcpy(&(filebuf[i]), charstringP, charstringL); - i+=charstringL; - i+=sprintf( &(filebuf[i]), " %s\n", ndstring); - csdone[currstring_no-1]=1; - sprintf( err_warn_msg_buf, - "Processing of CS ""%s"" for index %d successful (len=%d bytes, line=%d bytes)", - charnameP, j, charstringL, i-k); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - } - else { - sprintf( err_warn_msg_buf, "Skipped multiple processing of CS ""%s"" (index %d)", - charnameP, j); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - } - } - } - - /* Get rid of temporary data */ - if (csdone!=NULL) { - free( csdone); - csdone = NULL; - } - if ( cci != NULL ) { - free( cci); - cci = NULL; - } - - /* All charstrings are written. Some PostScript code follows */ - i+=sprintf( &(filebuf[i]), - "end\nend\nreadonly put\nnoaccess put\ndup /FontName get exch definefont pop\nmark currentfile closefile\n"); - sprintf( err_warn_msg_buf, - "Charstrings and Font definition finished (%d data bytes, from which %d bytes will be encrypted)", - i, i-dindex); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - - /* we compute the size of the encrypted area. */ - if (encrypt==1) { - encryptsize=i-dindex; - encryptsize+=4; /* the four random bytes */ - encryptsize*=2; /* since we use ASCII-hex output */ - encryptsize+=(int)ceil((double)encryptsize/linewidth); /* we need a few newline characters - to adjust the output format */ - } - else if (encrypt==2) { /* binary encryption. The whole data is contiguous - and only at the end of the data a newline is - added. */ - encryptsize=i-dindex+1; - encryptsize+=4; /* the four random bytes */ - } - else { /*The case of no encryption does not produce - valid fonts, it is for debugging purposes only */ - encryptsize=i-dindex+1; - } - - - /* we add the size of the 512 zeros and the cleartomark */ - trailersize+=ZEROS; - trailersize+=(int)ceil((double)ZEROS/linewidth); - trailersize+=12; /* cleartomark */ - - /* Search for remaining PostScript code in the last 1024 bytes. This - should suffice for any font. */ - tr_len=T1GetTrailer( linebuf, 1025, ifp); - T1Close(ifp); /* we do not need the file any longer */ - - /* And we add the size of the trailer. A trailer only consisting of - a newline is ignored because the newline has already been included - in the cleartomark-string. */ - if ( !((tr_len==1) && ((linebuf[0]=='\n') || (linebuf[0]=='\r')) ) ) { - trailersize+=tr_len; - } - - - if ((encryptbuf=(char *)calloc( encryptsize, 1))==NULL) { - T1_errno=T1ERR_ALLOC_MEM; - free( filebuf); - return( NULL); - } - - /* Allocate one byte in orer to be able to use sprintf() (which appends - an ASCII-\0).*/ - if ((trailerbuf=(char *)calloc( trailersize+1, 1))==NULL) { - T1_errno=T1ERR_ALLOC_MEM; - free( filebuf); - free( encryptbuf); - return( NULL); - } - - k=0; - colcount=0; - - /* perform eexec-encryption */ - eexec_r=55665; - if (encrypt==0) { - for (j=dindex; j<i; j++) { - encryptbuf[k++]=filebuf[j]; - } - } - else if ( encrypt==1) { - /* consume four random bytes. We take the numbers '0', '1', '2' - and '3'. The first cipher then is 217-dec (0xD9-hex), i.e., it - is no white space character. The resulting font can thus be - converted to pfb-format without the risk violating the Adobe spec.*/ - for (j=0; j<4; j++) { - cipher=EexecEncrypt( (unsigned char) j); - encryptbuf[k++]=highHexByte[cipher]; - if (++colcount==linewidth) { - colcount=0; - encryptbuf[k++]='\n'; - } - encryptbuf[k++]=lowHexByte[cipher]; - if (++colcount==linewidth) { - colcount=0; - encryptbuf[k++]='\n'; - } - } - for (j=dindex; j<i; j++) { - cipher=EexecEncrypt( (unsigned char) filebuf[j]); - encryptbuf[k++]=highHexByte[cipher]; - if (++colcount==linewidth) { - colcount=0; - encryptbuf[k++]='\n'; - } - encryptbuf[k++]=lowHexByte[cipher]; - if (++colcount==linewidth) { - colcount=0; - encryptbuf[k++]='\n'; - } - } - /* If necessary, append newline char */ - if (encryptbuf[k-1]!='\n') { - encryptbuf[k++]='\n'; - } - } /* if encrypt==1 */ - else { /* four random bytes ... */ - for (j=0; j<4; j++) { - encryptbuf[k++]=EexecEncrypt( (unsigned char) j); - } - for (j=dindex; j<i; j++) { /* and encrypted charstrings */ - encryptbuf[k++]=EexecEncrypt( (unsigned char) filebuf[j]); - } - } /* encrypt == 2 */ - /* Encryption finished */ - - /* If necessary, append newline char */ - if (encryptbuf[k-1]!='\n') { - encryptbuf[k++]='\n'; - } - - colcount=0; - /* Append zeroes and cleartomark */ - for (j=0; j<ZEROS; j++) { - trailerbuf[l++]='0'; - if (++colcount==linewidth) { - colcount=0; - trailerbuf[l++]='\n'; - } - } - /* If necessary, append newline char */ - if (trailerbuf[l-1]!='\n') { - trailerbuf[l++]='\n'; - } - l+=sprintf( &(trailerbuf[l]), "cleartomark\n"); - if ( !((tr_len==1) && ((linebuf[0]=='\n') || (linebuf[0]=='\r')) ) ) { - sprintf( err_warn_msg_buf, - "Including additional PostScript trailer (%d bytes)", - tr_len); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - l+=sprintf( &(trailerbuf[l]), linebuf); /* contains the PostScript trailer */ - } - - /* compute size of output file */ - outsize=0; - if (encrypt==2) { /* binary encryption, take care about pfb-blocks */ - /* each segment requires 6 bytes for the header */ - filesegs=(int)(ceil((double)dindex/maxblocksize)); - encryptsegs=(int)(ceil((double)k/maxblocksize)); - trailersegs=(int)(ceil((double)l/maxblocksize)); - /* trainling ASCII-part: */ - outsize +=dindex; - /* binary encrypted data */ - outsize +=k; - /* leading ASCII-part: */ - outsize +=l; - /* segment headers */ - outsize +=6*(filesegs+encryptsegs+trailersegs); - outsize +=2; /* the EOF-marker segment */ - } - else { /* ASCII-hex encryption or no encryption: no segmentation */ - outsize=dindex+k+l; - } - - if ((outbuf=(char *)calloc( outsize, 1))==NULL) { - T1_errno=T1ERR_ALLOC_MEM; - free( filebuf); - free( encryptbuf); - free( trailerbuf); - return( NULL); - } - - - - /* The full bufsize is given as the unencrypted portion plus size - of encryptbuf (which also inccorporates an unencrypted trailer). - In addition, the segment headers have to be taken into account for - pfb-format. */ - i=0; - if (encrypt==2) { /* we have to add segment headers */ - T1_PrintLog( "T1_SubsetFont()", "Setting up segmented binary buffer (pfb-format)", - T1LOG_DEBUG); - /* Clear text header */ - m=0; - for ( j=0; j<filesegs; j++) { - if (j==filesegs-1) - n=dindex % maxblocksize; - else - n=maxblocksize; - i +=make_pfb_segment_header( &(outbuf[i]), SEGMENT_ASCII, n); - memcpy( &(outbuf[i]), &(filebuf[m]), n); - i +=n; - m +=n; - } - sprintf( err_warn_msg_buf, - " Readable header (%d bytes: %d data bytes in %d ASCII-segments of maximum size %lu bytes)", - i, dindex, filesegs, maxblocksize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - /* Binary data */ - m=0; - o=i; - for ( j=0; j<encryptsegs; j++) { - if (j==encryptsegs-1) - n=k % maxblocksize; - else - n=maxblocksize; - i +=make_pfb_segment_header( &(outbuf[i]), SEGMENT_BINARY, n); - memcpy( &(outbuf[i]), &(encryptbuf[m]), n); - i +=n; - m +=n; - } - sprintf( err_warn_msg_buf, - " Binary data (%d bytes: %d data bytes in %d binary segments of maximum size %lu bytes)", - i-o, k, encryptsegs, maxblocksize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - /* Readable ASCII-trailer */ - m=0; - o=i; - for ( j=0; j<trailersegs; j++) { - if (j==trailersegs-1) - n=l % maxblocksize; - else - n=maxblocksize; - i +=make_pfb_segment_header( &(outbuf[i]), SEGMENT_ASCII, n); - memcpy( &(outbuf[i]), &(trailerbuf[m]), n); - i +=n; - m +=n; - } - sprintf( err_warn_msg_buf, - " Readable trailer (%d bytes: %d data bytes in %d ASCII-segments of maximum size %lu bytes)", - i-o, l, trailersegs, maxblocksize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - i +=make_pfb_segment_header( &(outbuf[i]), SEGMENT_EOF, 0); - sprintf( err_warn_msg_buf, - " EOF-segment marker (2 bytes)"); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - *bufsize=i; - } /* end of pfb-setup */ - else { /* we continuously copy the data */ - if (encrypt==1) - sprintf( err_warn_msg_buf, - "Dumping output buffer (%d bytes: %d readable ASCII, %d ASCII-hex in lines of width %d, %d readable ASCII)", - dindex+k+l, dindex, k, linewidth, l); - else - sprintf( err_warn_msg_buf, - "Dumping output buffer (%d bytes: %d readable ASCII, %d non-encrypted binary, %d readable ASCII)", - dindex+k+l, dindex, k, l); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - memcpy( outbuf, filebuf, dindex); - memcpy( &(outbuf[dindex]), encryptbuf, k); - memcpy( &(outbuf[dindex+k]), trailerbuf, l); - *bufsize=dindex+k+l; - } - - sprintf( err_warn_msg_buf, - "Output buffer is %ld bytes, original file size is %lu bytes", - *bufsize, filesize); - T1_PrintLog( "T1_SubsetFont()", err_warn_msg_buf, - T1LOG_DEBUG); - - - if (encryptbuf!=NULL) - free(encryptbuf); - if (trailerbuf!=NULL) - free(trailerbuf); - if (filebuf!=NULL) - free( filebuf); - - return( outbuf); - -} - - - -/* This function returns the encrypted charstring of character - charname of font FontID. The length is saved at len */ -char *T1_GetCharString( int FontID, char *charname, int *len) -{ - - static char *charstring=NULL; - - if (T1_CheckForFontID(FontID)!=1) { - T1_errno=T1ERR_INVALID_FONTID; - return(NULL); - } - - if ( (charname==NULL) || (len==0) ) { - T1_errno=T1ERR_INVALID_PARAMETER; - return(NULL); - } - - if ((locateCharString( FontID, charname))==0) { - *len=0; - T1_errno=T1ERR_UNSPECIFIED; - return( NULL); - } - - if (charstring!=NULL) { - free( charstring); - charstring=NULL; - } - if ((charstring=(char *)malloc( charstringL))==NULL) { - *len=0; - T1_errno=T1ERR_ALLOC_MEM; - return( NULL); - } - - memcpy( charstring, charstringP, charstringL); - *len=charstringL; - return( charstring); - -} - - - -/* For those who really need it, this function returns the value - of lenIV from the Private dictionary. It specifies how many - random leading bytes are used in Charstring encryption in the - current font. */ -int T1_GetlenIV( int FontID) -{ - - if (T1_CheckForFontID(FontID)!=1) { - T1_errno=T1ERR_INVALID_FONTID; - return( -2); - } - return( pFontBase->pFontArray[FontID].pType1Data->Private[LENIV].value.data.integer); - -} |