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 @@ + + + + +TB9.2 Example Applications: examples/PIPS/antiword/src/dib2eps.c Source File + + + + + +

examples/PIPS/antiword/src/dib2eps.c

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 */
+
+
Generated by  + +doxygen 1.6.2
+ +