diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/dib2eps_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/dib2eps_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,525 @@ + + +
+ +00001 /* +00002 * dib2eps.c +00003 * Copyright (C) 2000-2003 A.J. van Os; Released under GPL +00004 * +00005 * Description: +00006 * Functions to translate dib pictures into eps +00007 * +00008 *================================================================ +00009 * This part of the software is based on: +00010 * The Windows Bitmap Decoder Class part of paintlib +00011 * Paintlib is copyright (c) 1996-2000 Ulrich von Zadow +00012 *================================================================ +00013 * The credit should go to him, but all the bugs are mine. +00014 */ +00015 +00016 #include <stdio.h> +00017 #include "antiword.h" +00018 +00019 +00020 /* +00021 * vDecode1bpp - decode an uncompressed 1 bit per pixel image +00022 */ +00023 static void +00024 vDecode1bpp(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00025 { +00026 size_t tPadding; +00027 int iX, iY, iN, iByte, iTmp, iEighthWidth, iUse; +00028 +00029 DBG_MSG("vDecode1bpp"); +00030 +00031 fail(pOutFile == NULL); +00032 fail(pImg == NULL); +00033 fail(pImg->iColorsUsed < 1 || pImg->iColorsUsed > 2); +00034 +00035 DBG_DEC(pImg->iWidth); +00036 DBG_DEC(pImg->iHeight); +00037 +00038 iEighthWidth = (pImg->iWidth + 7) / 8; +00039 tPadding = (size_t)(ROUND4(iEighthWidth) - iEighthWidth); +00040 +00041 for (iY = 0; iY < pImg->iHeight; iY++) { +00042 for (iX = 0; iX < iEighthWidth; iX++) { +00043 iByte = iNextByte(pInFile); +00044 if (iByte == EOF) { +00045 vASCII85EncodeByte(pOutFile, EOF); +00046 return; +00047 } +00048 if (iX == iEighthWidth - 1 && pImg->iWidth % 8 != 0) { +00049 iUse = pImg->iWidth % 8; +00050 } else { +00051 iUse = 8; +00052 } +00053 for (iN = 0; iN < iUse; iN++) { +00054 switch (iN) { +00055 case 0: iTmp = (iByte & 0x80) / 128; break; +00056 case 1: iTmp = (iByte & 0x40) / 64; break; +00057 case 2: iTmp = (iByte & 0x20) / 32; break; +00058 case 3: iTmp = (iByte & 0x10) / 16; break; +00059 case 4: iTmp = (iByte & 0x08) / 8; break; +00060 case 5: iTmp = (iByte & 0x04) / 4; break; +00061 case 6: iTmp = (iByte & 0x02) / 2; break; +00062 case 7: iTmp = (iByte & 0x01); break; +00063 default: iTmp = 0; break; +00064 } +00065 vASCII85EncodeByte(pOutFile, iTmp); +00066 } +00067 } +00068 (void)tSkipBytes(pInFile, tPadding); +00069 } +00070 vASCII85EncodeByte(pOutFile, EOF); +00071 } /* end of vDecode1bpp */ +00072 +00073 /* +00074 * vDecode4bpp - decode an uncompressed 4 bits per pixel image +00075 */ +00076 static void +00077 vDecode4bpp(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00078 { +00079 size_t tPadding; +00080 int iX, iY, iN, iByte, iTmp, iHalfWidth, iUse; +00081 +00082 DBG_MSG("vDecode4bpp"); +00083 +00084 fail(pInFile == NULL); +00085 fail(pOutFile == NULL); +00086 fail(pImg == NULL); +00087 fail(pImg->iColorsUsed < 1 || pImg->iColorsUsed > 16); +00088 +00089 DBG_DEC(pImg->iWidth); +00090 DBG_DEC(pImg->iHeight); +00091 +00092 iHalfWidth = (pImg->iWidth + 1) / 2; +00093 tPadding = (size_t)(ROUND4(iHalfWidth) - iHalfWidth); +00094 +00095 for (iY = 0; iY < pImg->iHeight; iY++) { +00096 for (iX = 0; iX < iHalfWidth; iX++) { +00097 iByte = iNextByte(pInFile); +00098 if (iByte == EOF) { +00099 vASCII85EncodeByte(pOutFile, EOF); +00100 return; +00101 } +00102 if (iX == iHalfWidth - 1 && odd(pImg->iWidth)) { +00103 iUse = 1; +00104 } else { +00105 iUse = 2; +00106 } +00107 for (iN = 0; iN < iUse; iN++) { +00108 if (odd(iN)) { +00109 iTmp = iByte & 0x0f; +00110 } else { +00111 iTmp = (iByte & 0xf0) / 16; +00112 } +00113 vASCII85EncodeByte(pOutFile, iTmp); +00114 } +00115 } +00116 (void)tSkipBytes(pInFile, tPadding); +00117 } +00118 vASCII85EncodeByte(pOutFile, EOF); +00119 } /* end of vDecode4bpp */ +00120 +00121 /* +00122 * vDecode8bpp - decode an uncompressed 8 bits per pixel image +00123 */ +00124 static void +00125 vDecode8bpp(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00126 { +00127 size_t tPadding; +00128 int iX, iY, iByte; +00129 +00130 DBG_MSG("vDecode8bpp"); +00131 +00132 fail(pInFile == NULL); +00133 fail(pOutFile == NULL); +00134 fail(pImg == NULL); +00135 fail(pImg->iColorsUsed < 1 || pImg->iColorsUsed > 256); +00136 +00137 DBG_DEC(pImg->iWidth); +00138 DBG_DEC(pImg->iHeight); +00139 +00140 tPadding = (size_t)(ROUND4(pImg->iWidth) - pImg->iWidth); +00141 +00142 for (iY = 0; iY < pImg->iHeight; iY++) { +00143 for (iX = 0; iX < pImg->iWidth; iX++) { +00144 iByte = iNextByte(pInFile); +00145 if (iByte == EOF) { +00146 vASCII85EncodeByte(pOutFile, EOF); +00147 return; +00148 } +00149 vASCII85EncodeByte(pOutFile, iByte); +00150 } +00151 (void)tSkipBytes(pInFile, tPadding); +00152 } +00153 vASCII85EncodeByte(pOutFile, EOF); +00154 } /* end of vDecode8bpp */ +00155 +00156 /* +00157 * vDecode24bpp - decode an uncompressed 24 bits per pixel image +00158 */ +00159 static void +00160 vDecode24bpp(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00161 { +00162 size_t tPadding; +00163 int iX, iY, iBlue, iGreen, iRed, iTripleWidth; +00164 +00165 DBG_MSG("vDecode24bpp"); +00166 +00167 fail(pInFile == NULL); +00168 fail(pOutFile == NULL); +00169 fail(pImg == NULL); +00170 fail(!pImg->bColorImage); +00171 +00172 DBG_DEC(pImg->iWidth); +00173 DBG_DEC(pImg->iHeight); +00174 +00175 iTripleWidth = pImg->iWidth * 3; +00176 tPadding = (size_t)(ROUND4(iTripleWidth) - iTripleWidth); +00177 +00178 for (iY = 0; iY < pImg->iHeight; iY++) { +00179 for (iX = 0; iX < pImg->iWidth; iX++) { +00180 /* Change from BGR order to RGB order */ +00181 iBlue = iNextByte(pInFile); +00182 if (iBlue == EOF) { +00183 vASCII85EncodeByte(pOutFile, EOF); +00184 return; +00185 } +00186 iGreen = iNextByte(pInFile); +00187 if (iGreen == EOF) { +00188 vASCII85EncodeByte(pOutFile, EOF); +00189 return; +00190 } +00191 iRed = iNextByte(pInFile); +00192 if (iRed == EOF) { +00193 vASCII85EncodeByte(pOutFile, EOF); +00194 return; +00195 } +00196 vASCII85EncodeByte(pOutFile, iRed); +00197 vASCII85EncodeByte(pOutFile, iGreen); +00198 vASCII85EncodeByte(pOutFile, iBlue); +00199 } +00200 (void)tSkipBytes(pInFile, tPadding); +00201 } +00202 vASCII85EncodeByte(pOutFile, EOF); +00203 } /* end of vDecode24bpp */ +00204 +00205 /* +00206 * vDecodeRle4 - decode a RLE compressed 4 bits per pixel image +00207 */ +00208 static void +00209 vDecodeRle4(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00210 { +00211 int iX, iY, iByte, iTmp, iRunLength, iRun; +00212 BOOL bEOF, bEOL; +00213 +00214 DBG_MSG("vDecodeRle4"); +00215 +00216 fail(pInFile == NULL); +00217 fail(pOutFile == NULL); +00218 fail(pImg == NULL); +00219 fail(pImg->iColorsUsed < 1 || pImg->iColorsUsed > 16); +00220 +00221 DBG_DEC(pImg->iWidth); +00222 DBG_DEC(pImg->iHeight); +00223 +00224 bEOF = FALSE; +00225 +00226 for (iY = 0; iY < pImg->iHeight && !bEOF; iY++) { +00227 bEOL = FALSE; +00228 iX = 0; +00229 while (!bEOL) { +00230 iRunLength = iNextByte(pInFile); +00231 if (iRunLength == EOF) { +00232 vASCII85EncodeByte(pOutFile, EOF); +00233 return; +00234 } +00235 if (iRunLength != 0) { +00236 /* +00237 * Encoded packet: +00238 * RunLength pixels, all the "same" value +00239 */ +00240 iByte = iNextByte(pInFile); +00241 if (iByte == EOF) { +00242 vASCII85EncodeByte(pOutFile, EOF); +00243 return; +00244 } +00245 for (iRun = 0; iRun < iRunLength; iRun++) { +00246 if (odd(iRun)) { +00247 iTmp = iByte & 0x0f; +00248 } else { +00249 iTmp = (iByte & 0xf0) / 16; +00250 } +00251 if (iX < pImg->iWidth) { +00252 vASCII85EncodeByte(pOutFile, iTmp); +00253 } +00254 iX++; +00255 } +00256 continue; +00257 } +00258 /* Literal or escape */ +00259 iRunLength = iNextByte(pInFile); +00260 if (iRunLength == EOF) { +00261 vASCII85EncodeByte(pOutFile, EOF); +00262 return; +00263 } +00264 if (iRunLength == 0) { /* End of line escape */ +00265 bEOL = TRUE; +00266 } else if (iRunLength == 1) { /* End of file escape */ +00267 bEOF = TRUE; +00268 bEOL = TRUE; +00269 } else if (iRunLength == 2) { /* Delta escape */ +00270 DBG_MSG("RLE4: encountered delta escape"); +00271 bEOF = TRUE; +00272 bEOL = TRUE; +00273 } else { /* Literal packet */ +00274 iByte = 0; +00275 for (iRun = 0; iRun < iRunLength; iRun++) { +00276 if (odd(iRun)) { +00277 iTmp = iByte & 0x0f; +00278 } else { +00279 iByte = iNextByte(pInFile); +00280 if (iByte == EOF) { +00281 vASCII85EncodeByte(pOutFile, EOF); +00282 return; +00283 } +00284 iTmp = (iByte & 0xf0) / 16; +00285 } +00286 if (iX < pImg->iWidth) { +00287 vASCII85EncodeByte(pOutFile, iTmp); +00288 } +00289 iX++; +00290 } +00291 /* Padding if the number of bytes is odd */ +00292 if (odd((iRunLength + 1) / 2)) { +00293 (void)tSkipBytes(pInFile, 1); +00294 } +00295 } +00296 } +00297 DBG_DEC_C(iX != pImg->iWidth, iX); +00298 } +00299 vASCII85EncodeByte(pOutFile, EOF); +00300 } /* end of vDecodeRle4 */ +00301 +00302 /* +00303 * vDecodeRle8 - decode a RLE compressed 8 bits per pixel image +00304 */ +00305 static void +00306 vDecodeRle8(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00307 { +00308 int iX, iY, iByte, iRunLength, iRun; +00309 BOOL bEOF, bEOL; +00310 +00311 DBG_MSG("vDecodeRle8"); +00312 +00313 fail(pInFile == NULL); +00314 fail(pOutFile == NULL); +00315 fail(pImg == NULL); +00316 fail(pImg->iColorsUsed < 1 || pImg->iColorsUsed > 256); +00317 +00318 DBG_DEC(pImg->iWidth); +00319 DBG_DEC(pImg->iHeight); +00320 +00321 bEOF = FALSE; +00322 +00323 for (iY = 0; iY < pImg->iHeight && !bEOF; iY++) { +00324 bEOL = FALSE; +00325 iX = 0; +00326 while (!bEOL) { +00327 iRunLength = iNextByte(pInFile); +00328 if (iRunLength == EOF) { +00329 vASCII85EncodeByte(pOutFile, EOF); +00330 return; +00331 } +00332 if (iRunLength != 0) { +00333 /* +00334 * Encoded packet: +00335 * RunLength pixels, all the same value +00336 */ +00337 iByte = iNextByte(pInFile); +00338 if (iByte == EOF) { +00339 vASCII85EncodeByte(pOutFile, EOF); +00340 return; +00341 } +00342 for (iRun = 0; iRun < iRunLength; iRun++) { +00343 if (iX < pImg->iWidth) { +00344 vASCII85EncodeByte(pOutFile, iByte); +00345 } +00346 iX++; +00347 } +00348 continue; +00349 } +00350 /* Literal or escape */ +00351 iRunLength = iNextByte(pInFile); +00352 if (iRunLength == EOF) { +00353 vASCII85EncodeByte(pOutFile, EOF); +00354 return; +00355 } +00356 if (iRunLength == 0) { /* End of line escape */ +00357 bEOL = TRUE; +00358 } else if (iRunLength == 1) { /* End of file escape */ +00359 bEOF = TRUE; +00360 bEOL = TRUE; +00361 } else if (iRunLength == 2) { /* Delta escape */ +00362 DBG_MSG("RLE8: encountered delta escape"); +00363 bEOF = TRUE; +00364 bEOL = TRUE; +00365 } else { /* Literal packet */ +00366 for (iRun = 0; iRun < iRunLength; iRun++) { +00367 iByte = iNextByte(pInFile); +00368 if (iByte == EOF) { +00369 vASCII85EncodeByte(pOutFile, EOF); +00370 return; +00371 } +00372 if (iX < pImg->iWidth) { +00373 vASCII85EncodeByte(pOutFile, iByte); +00374 } +00375 iX++; +00376 } +00377 /* Padding if the number of bytes is odd */ +00378 if (odd(iRunLength)) { +00379 (void)tSkipBytes(pInFile, 1); +00380 } +00381 } +00382 } +00383 DBG_DEC_C(iX != pImg->iWidth, iX); +00384 } +00385 vASCII85EncodeByte(pOutFile, EOF); +00386 } /* end of vDecodeRle8 */ +00387 +00388 /* +00389 * vDecodeDIB - decode a dib picture +00390 */ +00391 static void +00392 vDecodeDIB(FILE *pInFile, FILE *pOutFile, const imagedata_type *pImg) +00393 { +00394 size_t tHeaderSize; +00395 +00396 fail(pInFile == NULL); +00397 fail(pOutFile == NULL); +00398 fail(pImg == NULL); +00399 +00400 /* Skip the bitmap info header */ +00401 tHeaderSize = (size_t)ulNextLong(pInFile); +00402 (void)tSkipBytes(pInFile, tHeaderSize - 4); +00403 /* Skip the colortable */ +00404 if (pImg->uiBitsPerComponent <= 8) { +00405 (void)tSkipBytes(pInFile, +00406 (size_t)(pImg->iColorsUsed * +00407 ((tHeaderSize > 12) ? 4 : 3))); +00408 } +00409 +00410 switch (pImg->uiBitsPerComponent) { +00411 case 1: +00412 fail(pImg->eCompression != compression_none); +00413 vDecode1bpp(pInFile, pOutFile, pImg); +00414 break; +00415 case 4: +00416 fail(pImg->eCompression != compression_none && +00417 pImg->eCompression != compression_rle4); +00418 if (pImg->eCompression == compression_rle4) { +00419 vDecodeRle4(pInFile, pOutFile, pImg); +00420 } else { +00421 vDecode4bpp(pInFile, pOutFile, pImg); +00422 } +00423 break; +00424 case 8: +00425 fail(pImg->eCompression != compression_none && +00426 pImg->eCompression != compression_rle8); +00427 if (pImg->eCompression == compression_rle8) { +00428 vDecodeRle8(pInFile, pOutFile, pImg); +00429 } else { +00430 vDecode8bpp(pInFile, pOutFile, pImg); +00431 } +00432 break; +00433 case 24: +00434 fail(pImg->eCompression != compression_none); +00435 vDecode24bpp(pInFile, pOutFile, pImg); +00436 break; +00437 default: +00438 DBG_DEC(pImg->uiBitsPerComponent); +00439 break; +00440 } +00441 } /* end of vDecodeDIB */ +00442 +00443 #if defined(DEBUG) +00444 /* +00445 * vCopy2File +00446 */ +00447 static void +00448 vCopy2File(FILE *pInFile, ULONG ulFileOffset, size_t tPictureLen) +00449 { +00450 static int iPicCounter = 0; +00451 FILE *pOutFile; +00452 size_t tIndex; +00453 int iTmp; +00454 char szFilename[30]; +00455 +00456 if (!bSetDataOffset(pInFile, ulFileOffset)) { +00457 return; +00458 } +00459 +00460 sprintf(szFilename, "/tmp/pic/pic%04d.bmp", ++iPicCounter); +00461 pOutFile = fopen(szFilename, "wb"); +00462 if (pOutFile == NULL) { +00463 return; +00464 } +00465 /* Turn a dib into a bmp by adding a fake 14 byte header */ +00466 (void)putc('B', pOutFile); +00467 (void)putc('M', pOutFile); +00468 for (iTmp = 0; iTmp < 12; iTmp++) { +00469 if (putc(0, pOutFile) == EOF) { +00470 break; +00471 } +00472 } +00473 for (tIndex = 0; tIndex < tPictureLen; tIndex++) { +00474 iTmp = iNextByte(pInFile); +00475 if (putc(iTmp, pOutFile) == EOF) { +00476 break; +00477 } +00478 } +00479 (void)fclose(pOutFile); +00480 } /* end of vCopy2File */ +00481 #endif /* DEBUG */ +00482 +00483 /* +00484 * bTranslateDIB - translate a DIB picture +00485 * +00486 * This function translates a picture from dib to eps +00487 * +00488 * return TRUE when sucessful, otherwise FALSE +00489 */ +00490 BOOL +00491 bTranslateDIB(diagram_type *pDiag, FILE *pInFile, +00492 ULONG ulFileOffset, const imagedata_type *pImg) +00493 { +00494 #if defined(DEBUG) +00495 fail(pImg->tPosition > pImg->tLength); +00496 vCopy2File(pInFile, ulFileOffset, pImg->tLength - pImg->tPosition); +00497 #endif /* DEBUG */ +00498 +00499 /* Seek to start position of DIB data */ +00500 if (!bSetDataOffset(pInFile, ulFileOffset)) { +00501 return FALSE; +00502 } +00503 +00504 vImagePrologue(pDiag, pImg); +00505 vDecodeDIB(pInFile, pDiag->pOutFile, pImg); +00506 vImageEpilogue(pDiag); +00507 +00508 return TRUE; +00509 } /* end of bTranslateDIB */ +