diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__r_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/fonts__r_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,267 @@ + + +
+ +00001 /* +00002 * fonts_r.c +00003 * Copyright (C) 1999-2002 A.J. van Os; Released under GPL +00004 * +00005 * Description: +00006 * Functions to deal with fonts (RiscOs version) +00007 */ +00008 +00009 #include <stdlib.h> +00010 #include <string.h> +00011 #include "DeskLib:Font.h" +00012 #include "drawfile.h" +00013 #include "antiword.h" +00014 +00015 static font_handle tFontCurr = (font_handle)-1; +00016 +00017 /* +00018 * pOpenFontTableFile - open the Font translation file +00019 * Copy the file to the proper place if necessary. +00020 * +00021 * Returns the file pointer or NULL +00022 */ +00023 FILE * +00024 pOpenFontTableFile(void) +00025 { +00026 FILE *pFileR, *pFileW; +00027 char *szFontNamesFile; +00028 size_t tSize; +00029 BOOL bFailed; +00030 char acBuffer[256]; +00031 +00032 pFileR = fopen("<AntiWord$FontNamesFile>", "r"); +00033 if (pFileR != NULL) { +00034 /* The font table is already in the right directory */ +00035 return pFileR; +00036 } +00037 +00038 szFontNamesFile = getenv("AntiWord$FontNamesSave"); +00039 if (szFontNamesFile == NULL) { +00040 werr(0, "Warning: Name of the FontNames file not found"); +00041 return NULL; +00042 } +00043 DBG_MSG(szFontNamesFile); +00044 +00045 pFileR = fopen("<AntiWord$Dir>.Resources.Default", "r"); +00046 if (pFileR == NULL) { +00047 werr(0, "I can't find 'Resources.Default'"); +00048 return NULL; +00049 } +00050 /* Here the default font translation table is known to exist */ +00051 +00052 if (!bMakeDirectory(szFontNamesFile)) { +00053 werr(0, +00054 "I can't make a directory for the FontNames file"); +00055 return NULL; +00056 } +00057 /* Here the proper directory is known to exist */ +00058 +00059 pFileW = fopen(szFontNamesFile, "w"); +00060 if (pFileW == NULL) { +00061 (void)fclose(pFileR); +00062 werr(0, "I can't create a default FontNames file"); +00063 return NULL; +00064 } +00065 /* Here the proper directory is known to be writeable */ +00066 +00067 /* Copy the default FontNames file */ +00068 bFailed = FALSE; +00069 while (!feof(pFileR)) { +00070 tSize = fread(acBuffer, 1, sizeof(acBuffer), pFileR); +00071 if (ferror(pFileR)) { +00072 DBG_MSG("Read error"); +00073 bFailed = TRUE; +00074 break; +00075 } +00076 if (fwrite(acBuffer, 1, tSize, pFileW) != tSize) { +00077 DBG_MSG("Write error"); +00078 bFailed = TRUE; +00079 break; +00080 } +00081 } +00082 (void)fclose(pFileW); +00083 (void)fclose(pFileR); +00084 if (bFailed) { +00085 DBG_MSG("Copying the FontNames file failed"); +00086 (void)remove(szFontNamesFile); +00087 return NULL; +00088 } +00089 return fopen(szFontNamesFile, "r"); +00090 } /* end of pOpenFontTableFile */ +00091 +00092 /* +00093 * vCloseFont - close the current font, if any +00094 */ +00095 void +00096 vCloseFont(void) +00097 { +00098 os_error *e; +00099 +00100 NO_DBG_MSG("vCloseFont"); +00101 +00102 if (tFontCurr == (font_handle)-1) { +00103 return; +00104 } +00105 e = Font_LoseFont(tFontCurr); +00106 if (e != NULL) { +00107 werr(0, "Close font error %d: %s", e->errnum, e->errmess); +00108 } +00109 tFontCurr = (font_handle)-1; +00110 } /* end of vCloseFont */ +00111 +00112 /* +00113 * tOpenFont - make the specified font the current font +00114 * +00115 * Returns the font reference number for use in a draw file +00116 */ +00117 drawfile_fontref +00118 tOpenFont(UCHAR ucWordFontNumber, USHORT usFontStyle, USHORT usWordFontSize) +00119 { +00120 os_error *e; +00121 const char *szOurFontname; +00122 font_handle tFont; +00123 int iFontnumber; +00124 +00125 NO_DBG_MSG("tOpenFont"); +00126 NO_DBG_DEC(ucWordFontNumber); +00127 NO_DBG_HEX(usFontStyle); +00128 NO_DBG_DEC(usWordFontSize); +00129 +00130 /* Keep the relevant bits */ +00131 usFontStyle &= FONT_BOLD|FONT_ITALIC; +00132 NO_DBG_HEX(usFontStyle); +00133 +00134 iFontnumber = iGetFontByNumber(ucWordFontNumber, usFontStyle); +00135 szOurFontname = szGetOurFontname(iFontnumber); +00136 if (szOurFontname == NULL || szOurFontname[0] == '\0') { +00137 tFontCurr = (font_handle)-1; +00138 return (byte)0; +00139 } +00140 NO_DBG_MSG(szOurFontname); +00141 e = Font_FindFont(&tFont, (char *)szOurFontname, +00142 (int)usWordFontSize * 8, (int)usWordFontSize * 8, +00143 0, 0); +00144 if (e != NULL) { +00145 switch (e->errnum) { +00146 case 523: +00147 werr(0, "%s", e->errmess); +00148 break; +00149 default: +00150 werr(0, "Open font error %d: %s", +00151 e->errnum, e->errmess); +00152 break; +00153 } +00154 tFontCurr = (font_handle)-1; +00155 return (drawfile_fontref)0; +00156 } +00157 tFontCurr = tFont; +00158 NO_DBG_DEC(tFontCurr); +00159 return (drawfile_fontref)(iFontnumber + 1); +00160 } /* end of tOpenFont */ +00161 +00162 /* +00163 * tOpenTableFont - make the table font the current font +00164 * +00165 * Returns the font reference number for use in a draw file +00166 */ +00167 drawfile_fontref +00168 tOpenTableFont(USHORT usWordFontSize) +00169 { +00170 int iWordFontnumber; +00171 +00172 NO_DBG_MSG("tOpenTableFont"); +00173 +00174 iWordFontnumber = iFontname2Fontnumber(TABLE_FONT, FONT_REGULAR); +00175 if (iWordFontnumber < 0 || iWordFontnumber > (int)UCHAR_MAX) { +00176 DBG_DEC(iWordFontnumber); +00177 tFontCurr = (font_handle)-1; +00178 return (drawfile_fontref)0; +00179 } +00180 +00181 return tOpenFont((UCHAR)iWordFontnumber, FONT_REGULAR, usWordFontSize); +00182 } /* end of tOpenTableFont */ +00183 +00184 /* +00185 * lComputeStringWidth - compute the string width +00186 * +00187 * Returns the string width in millipoints +00188 */ +00189 long +00190 lComputeStringWidth(const char *szString, size_t tStringLength, +00191 drawfile_fontref tFontRef, USHORT usFontSize) +00192 { +00193 font_string tStr; +00194 os_error *e; +00195 +00196 fail(szString == NULL); +00197 fail(usFontSize < MIN_FONT_SIZE || usFontSize > MAX_FONT_SIZE); +00198 +00199 if (szString[0] == '\0' || tStringLength == 0) { +00200 /* Empty string */ +00201 return 0; +00202 } +00203 if (tStringLength == 1 && szString[0] == TABLE_SEPARATOR) { +00204 /* Font_strwidth doesn't like control characters */ +00205 return 0; +00206 } +00207 if (tFontCurr == (font_handle)-1) { +00208 /* No current font, use systemfont */ +00209 return lChar2MilliPoints(tStringLength); +00210 } +00211 tStr.s = (char *)szString; +00212 tStr.x = INT_MAX; +00213 tStr.y = INT_MAX; +00214 tStr.split = -1; +00215 tStr.term = tStringLength; +00216 e = Font_StringWidth(&tStr); +00217 if (e == NULL) { +00218 return (long)tStr.x; +00219 } +00220 DBG_DEC(e->errnum); +00221 DBG_MSG(e->errmess); +00222 DBG_DEC(tStringLength); +00223 DBG_MSG(szString); +00224 werr(0, "String width error %d: %s", e->errnum, e->errmess); +00225 return lChar2MilliPoints(tStringLength); +00226 } /* end of lComputeStringWidth */ +00227 +00228 /* +00229 * tCountColumns - count the number of columns in a string +00230 * +00231 * Returns the number of columns +00232 */ +00233 size_t +00234 tCountColumns(const char *szString, size_t tLength) +00235 { +00236 fail(szString == NULL); +00237 +00238 /* One byte, one character, one column */ +00239 return tLength; +00240 } /* end of tCountColumns */ +00241 +00242 /* +00243 * tGetCharacterLength - the length of the specified character in bytes +00244 * +00245 * Returns the length in bytes +00246 */ +00247 size_t +00248 tGetCharacterLength(const char *szString) +00249 { +00250 return 1; +00251 } /* end of tGetCharacterLength */ +