diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__u_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__u_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,327 +0,0 @@ - - - - -TB9.2 Example Applications: examples/PIPS/antiword/src/fonts_u.c Source File - - - - - -

examples/PIPS/antiword/src/fonts_u.c

00001 /*
-00002  * fonts_u.c
-00003  * Copyright (C) 1999-2004 A.J. van Os; Released under GNU GPL
-00004  *
-00005  * Description:
-00006  * Functions to deal with fonts (Unix version)
-00007  */
-00008 
-00009 #include <stdio.h>
-00010 #include <stdlib.h>
-00011 #include <string.h>
-00012 #include "antiword.h"
-00013 #include "fontinfo.h"
-00014 
-00015 /* Don't use fonts, just plain text */
-00016 static BOOL             bUsePlainText = TRUE;
-00017 /* Which character set should be used */
-00018 static encoding_type    eEncoding = encoding_neutral;
-00019 
-00020 
-00021 /*
-00022  * pOpenFontTableFile - open the Font translation file
-00023  *
-00024  * Returns the file pointer or NULL
-00025  */
-00026 FILE *
-00027 pOpenFontTableFile(void)
-00028 {
-00029         FILE            *pFile;
-00030         const char      *szHome, *szAntiword, *szGlobalFile;
-00031         char            szEnvironmentFile[PATH_MAX+1];
-00032         char            szLocalFile[PATH_MAX+1];
-00033 
-00034         szEnvironmentFile[0] = '\0';
-00035         szLocalFile[0] = '\0';
-00036 
-00037         /* Try the environment version of the fontnames file */
-00038         szAntiword = szGetAntiwordDirectory();
-00039         if (szAntiword != NULL && szAntiword[0] != '\0') {
-00040                 if (strlen(szAntiword) +
-00041                     sizeof(FILE_SEPARATOR FONTNAMES_FILE) >=
-00042                     sizeof(szEnvironmentFile)) {
-00043                         werr(0,
-00044                         "The name of your ANTIWORDHOME directory is too long");
-00045                         return NULL;
-00046                 }
-00047                 sprintf(szEnvironmentFile, "%s%s",
-00048                         szAntiword,
-00049                         FILE_SEPARATOR FONTNAMES_FILE);
-00050                 DBG_MSG(szEnvironmentFile);
-00051 
-00052                 pFile = fopen(szEnvironmentFile, "r");
-00053                 if (pFile != NULL) {
-00054                         return pFile;
-00055                 }
-00056         }
-00057 
-00058         /* Try the local version of the fontnames file */
-00059         szHome = szGetHomeDirectory();
-00060         if (strlen(szHome) +
-00061             sizeof(FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR FONTNAMES_FILE) >=
-00062             sizeof(szLocalFile)) {
-00063                 werr(0, "The name of your HOME directory is too long");
-00064                 return NULL;
-00065         }
-00066 
-00067         #ifndef SYMBIAN
-00068         sprintf(szLocalFile, "%s%s",
-00069                 szHome,
-00070                 FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR FONTNAMES_FILE);
-00071                 DBG_MSG(szLocalFile);
-00072         #else
-00073         sprintf(szLocalFile, "%s%s",
-00074                 szHome,
-00075                 FONTNAMES_FILE);
-00076                 DBG_MSG(szLocalFile);
-00077         #endif /*SYMBIAN*/
-00078         pFile = fopen(szLocalFile, "r");
-00079         if (pFile != NULL) {
-00080                 return pFile;
-00081         }
-00082 
-00083         /* Try the global version of the fontnames file */
-00084         szGlobalFile = GLOBAL_ANTIWORD_DIR FILE_SEPARATOR FONTNAMES_FILE;
-00085         DBG_MSG(szGlobalFile);
-00086 
-00087         pFile = fopen(szGlobalFile, "r");
-00088         if (pFile != NULL) {
-00089                 return pFile;
-00090         }
-00091 
-00092         if (szEnvironmentFile[0] != '\0') {
-00093                 werr(0, "I can not open your fontnames file.\n"
-00094                         "Neither '%s' nor\n"
-00095                         "'%s' nor\n"
-00096                         "'%s' can be opened for reading.",
-00097                         szEnvironmentFile, szLocalFile, szGlobalFile);
-00098         } else {
-00099                 werr(0, "I can not open your fontnames file.\n"
-00100                         "Neither '%s' nor\n"
-00101                         "'%s' can be opened for reading.",
-00102                         szLocalFile, szGlobalFile);
-00103         }
-00104         return NULL;
-00105 } /* end of pOpenFontTableFile */
-00106 
-00107 /*
-00108  * vCloseFont - close the current font, if any
-00109  */
-00110 void
-00111 vCloseFont(void)
-00112 {
-00113         NO_DBG_MSG("vCloseFont");
-00114         /* For safety: to be overwritten at the next call of tOpenfont() */
-00115         eEncoding = encoding_neutral;
-00116         bUsePlainText = TRUE;
-00117 } /* end of vCloseFont */
-00118 
-00119 /*
-00120  * tOpenFont - make the specified font the current font
-00121  *
-00122  * Returns the font reference number
-00123  */
-00124 drawfile_fontref
-00125 tOpenFont(UCHAR ucWordFontNumber, USHORT usFontStyle, USHORT usWordFontSize)
-00126 {
-00127         options_type    tOptions;
-00128         const char      *szOurFontname;
-00129         size_t  tIndex;
-00130         int     iFontnumber;
-00131 
-00132         NO_DBG_MSG("tOpenFont");
-00133         NO_DBG_DEC(ucWordFontNumber);
-00134         NO_DBG_HEX(usFontStyle);
-00135         NO_DBG_DEC(usWordFontSize);
-00136 
-00137         /* Keep the relevant bits */
-00138         usFontStyle &= FONT_BOLD|FONT_ITALIC;
-00139         NO_DBG_HEX(usFontStyle);
-00140 
-00141         vGetOptions(&tOptions);
-00142         eEncoding = tOptions.eEncoding;
-00143         bUsePlainText = tOptions.eConversionType != conversion_draw &&
-00144                         tOptions.eConversionType != conversion_ps &&
-00145                         tOptions.eConversionType != conversion_pdf;
-00146 
-00147         if (bUsePlainText) {
-00148                 /* Plain text, no fonts */
-00149                 return (drawfile_fontref)0;
-00150         }
-00151 
-00152         iFontnumber = iGetFontByNumber(ucWordFontNumber, usFontStyle);
-00153         szOurFontname = szGetOurFontname(iFontnumber);
-00154         if (szOurFontname == NULL || szOurFontname[0] == '\0') {
-00155                 DBG_DEC(iFontnumber);
-00156                 return (drawfile_fontref)0;
-00157         }
-00158         NO_DBG_MSG(szOurFontname);
-00159 
-00160         for (tIndex = 0; tIndex < elementsof(szFontnames); tIndex++) {
-00161                 if (STREQ(szFontnames[tIndex], szOurFontname)) {
-00162                         NO_DBG_DEC(tIndex);
-00163                         return (drawfile_fontref)tIndex;
-00164                 }
-00165         }
-00166         return (drawfile_fontref)0;
-00167 } /* end of tOpenFont */
-00168 
-00169 /*
-00170  * tOpenTableFont - make the table font the current font
-00171  *
-00172  * Returns the font reference number
-00173  */
-00174 drawfile_fontref
-00175 tOpenTableFont(USHORT usWordFontSize)
-00176 {
-00177         options_type    tOptions;
-00178         int     iWordFontnumber;
-00179 
-00180         NO_DBG_MSG("tOpenTableFont");
-00181 
-00182         vGetOptions(&tOptions);
-00183         eEncoding = tOptions.eEncoding;
-00184         bUsePlainText = tOptions.eConversionType != conversion_draw &&
-00185                         tOptions.eConversionType != conversion_ps &&
-00186                         tOptions.eConversionType != conversion_pdf;
-00187 
-00188         if (bUsePlainText) {
-00189                 /* Plain text, no fonts */
-00190                 return (drawfile_fontref)0;
-00191         }
-00192 
-00193         iWordFontnumber = iFontname2Fontnumber(TABLE_FONT, FONT_REGULAR);
-00194         if (iWordFontnumber < 0 || iWordFontnumber > (int)UCHAR_MAX) {
-00195                 DBG_DEC(iWordFontnumber);
-00196                 return (drawfile_fontref)0;
-00197         }
-00198 
-00199         return tOpenFont((UCHAR)iWordFontnumber, FONT_REGULAR, usWordFontSize);
-00200 } /* end of tOpenTableFont */
-00201 
-00202 /*
-00203  * szGetFontname - get the fontname
-00204  */
-00205 const char *
-00206 szGetFontname(drawfile_fontref tFontRef)
-00207 {
-00208         fail((size_t)(UCHAR)tFontRef >= elementsof(szFontnames));
-00209         return szFontnames[(int)(UCHAR)tFontRef];
-00210 } /* end of szGetFontname */
-00211 
-00212 /*
-00213  * lComputeStringWidth - compute the string width
-00214  *
-00215  * Note: the fontsize is specified in half-points!
-00216  *       the stringlength is specified in bytes, not characters!
-00217  *
-00218  * Returns the string width in millipoints
-00219  */
-00220 long
-00221 lComputeStringWidth(const char *szString, size_t tStringLength,
-00222         drawfile_fontref tFontRef, USHORT usFontSize)
-00223 {
-00224         USHORT  *ausCharWidths;
-00225         UCHAR   *pucChar;
-00226         long    lRelWidth;
-00227         size_t  tIndex;
-00228         int     iFontRef;
-00229 
-00230         fail(szString == NULL);
-00231         fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE);
-00232 
-00233         if (szString[0] == '\0' || tStringLength == 0) {
-00234                 /* Empty string */
-00235                 return 0;
-00236         }
-00237 
-00238         if (eEncoding == encoding_utf_8) {
-00239                 fail(!bUsePlainText);
-00240                 return lChar2MilliPoints(
-00241                         utf8_strwidth(szString, tStringLength));
-00242         }
-00243 
-00244         if (bUsePlainText) {
-00245                 /* No current font, use "systemfont" */
-00246                 return lChar2MilliPoints(tStringLength);
-00247         }
-00248 
-00249         if (eEncoding == encoding_cyrillic) {
-00250                 /* FIXME: until the character tables are available */
-00251                 return (tStringLength * 600L * (long)usFontSize + 1) / 2;
-00252         }
-00253 
-00254         DBG_DEC_C(eEncoding != encoding_latin_1 &&
-00255                 eEncoding != encoding_latin_2, eEncoding);
-00256         fail(eEncoding != encoding_latin_1 &&
-00257                 eEncoding != encoding_latin_2);
-00258 
-00259         /* Compute the relative string width */
-00260         iFontRef = (int)(UCHAR)tFontRef;
-00261         if (eEncoding == encoding_latin_2) {
-00262                 ausCharWidths = ausCharacterWidths2[iFontRef];
-00263         } else {
-00264                 ausCharWidths = ausCharacterWidths1[iFontRef];
-00265         }
-00266         lRelWidth = 0;
-00267         for (tIndex = 0, pucChar = (UCHAR *)szString;
-00268              tIndex < tStringLength;
-00269              tIndex++, pucChar++) {
-00270                 lRelWidth += (long)ausCharWidths[(int)*pucChar];
-00271         }
-00272 
-00273         /* Compute the absolute string width */
-00274         return (lRelWidth * (long)usFontSize + 1) / 2;
-00275 } /* end of lComputeStringWidth */
-00276 
-00277 /*
-00278  * tCountColumns - count the number of columns in a string
-00279  *
-00280  * Note: the length is specified in bytes!
-00281  *       A UTF-8 a character can be 0, 1 or 2 columns wide.
-00282  *
-00283  * Returns the number of columns
-00284  */
-00285 size_t
-00286 tCountColumns(const char *szString, size_t tLength)
-00287 {
-00288         fail(szString == NULL);
-00289 
-00290         if (eEncoding != encoding_utf_8) {
-00291                 /* One byte, one character, one column */
-00292                 return tLength;
-00293         }
-00294         return (size_t)utf8_strwidth(szString, tLength);
-00295 } /* end of tCountColumns */
-00296 
-00297 /*
-00298  * tGetCharacterLength - the length of the specified character in bytes
-00299  *
-00300  * Returns the length in bytes
-00301  */
-00302 size_t
-00303 tGetCharacterLength(const char *szString)
-00304 {
-00305         fail(szString == NULL);
-00306 
-00307         if (eEncoding != encoding_utf_8) {
-00308                 return 1;
-00309         }
-00310         return (size_t)utf8_chrlength(szString);
-00311 } /* end of tGetCharacterLength */
-
-
Generated by  - -doxygen 1.6.2
- -