diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__u_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__u_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,327 @@ + + + + +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
+ +