00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <stdio.h>
00011 #include <ctype.h>
00012 #include "antiword.h"
00013
00014 #if defined(DEBUG)
00015 static int iPicCounter = 0;
00016 #endif
00017
00018
00019
00020
00021
00022
00023
00024 static size_t
00025 tSkipToData(FILE *pFile, size_t tMaxBytes, size_t *ptSkipped)
00026 {
00027 ULONG ulName, ulTmp;
00028 size_t tDataLength, tToSkip;
00029 int iCounter;
00030
00031 fail(pFile == NULL);
00032 fail(ptSkipped == NULL);
00033
00034
00035 while (*ptSkipped + 8 < tMaxBytes) {
00036 tDataLength = (size_t)ulNextLongBE(pFile);
00037 DBG_DEC(tDataLength);
00038 *ptSkipped += 4;
00039
00040 ulName = 0x00;
00041 for (iCounter = 0; iCounter < 4; iCounter++) {
00042 ulTmp = (ULONG)iNextByte(pFile);
00043 if (!isalpha((int)ulTmp)) {
00044 DBG_HEX(ulTmp);
00045 return (size_t)-1;
00046 }
00047 ulName <<= 8;
00048 ulName |= ulTmp;
00049 }
00050 DBG_HEX(ulName);
00051 *ptSkipped += 4;
00052
00053 if (ulName == PNG_CN_IEND) {
00054 break;
00055 }
00056 if (ulName == PNG_CN_IDAT) {
00057 return tDataLength;
00058 }
00059
00060 tToSkip = tDataLength + 4;
00061 if (tToSkip >= tMaxBytes - *ptSkipped) {
00062 DBG_DEC(tToSkip);
00063 DBG_DEC(tMaxBytes - *ptSkipped);
00064 return (size_t)-1;
00065 }
00066 (void)tSkipBytes(pFile, tToSkip);
00067 *ptSkipped += tToSkip;
00068 }
00069
00070 return (size_t)-1;
00071 }
00072
00073
00074
00075
00076
00077
00078 static size_t
00079 tFindFirstPixelData(FILE *pFile, size_t tMaxBytes, size_t *ptSkipped)
00080 {
00081 fail(pFile == NULL);
00082 fail(tMaxBytes == 0);
00083 fail(ptSkipped == NULL);
00084
00085 if (tMaxBytes < 8) {
00086 DBG_DEC(tMaxBytes);
00087 return (size_t)-1;
00088 }
00089
00090
00091 (void)tSkipBytes(pFile, 8);
00092 *ptSkipped = 8;
00093
00094 return tSkipToData(pFile, tMaxBytes, ptSkipped);
00095 }
00096
00097
00098
00099
00100
00101
00102 static size_t
00103 tFindNextPixelData(FILE *pFile, size_t tMaxBytes, size_t *ptSkipped)
00104 {
00105 fail(pFile == NULL);
00106 fail(tMaxBytes == 0);
00107 fail(ptSkipped == NULL);
00108
00109 if (tMaxBytes < 4) {
00110 DBG_DEC(tMaxBytes);
00111 return (size_t)-1;
00112 }
00113
00114
00115 (void)tSkipBytes(pFile, 4);
00116 *ptSkipped = 4;
00117
00118 return tSkipToData(pFile, tMaxBytes, ptSkipped);
00119 }
00120
00121 #if defined(DEBUG)
00122
00123
00124
00125 static void
00126 vCopy2File(FILE *pFile, ULONG ulFileOffset, size_t tPictureLen)
00127 {
00128 FILE *pOutFile;
00129 size_t tIndex;
00130 int iTmp;
00131 char szFilename[30];
00132
00133 if (!bSetDataOffset(pFile, ulFileOffset)) {
00134 return;
00135 }
00136
00137 sprintf(szFilename, "/tmp/pic/pic%04d.png", ++iPicCounter);
00138 pOutFile = fopen(szFilename, "wb");
00139 if (pOutFile == NULL) {
00140 return;
00141 }
00142 for (tIndex = 0; tIndex < tPictureLen; tIndex++) {
00143 iTmp = iNextByte(pFile);
00144 if (putc(iTmp, pOutFile) == EOF) {
00145 break;
00146 }
00147 }
00148 (void)fclose(pOutFile);
00149 }
00150 #endif
00151
00152
00153
00154
00155
00156
00157
00158
00159 BOOL
00160 bTranslatePNG(diagram_type *pDiag, FILE *pFile,
00161 ULONG ulFileOffset, size_t tPictureLen, const imagedata_type *pImg)
00162 {
00163 size_t tMaxBytes, tDataLength, tSkipped;
00164
00165 #if defined(DEBUG)
00166 vCopy2File(pFile, ulFileOffset, tPictureLen);
00167 #endif
00168
00169
00170 if (!bSetDataOffset(pFile, ulFileOffset)) {
00171 return FALSE;
00172 }
00173
00174 tMaxBytes = tPictureLen;
00175 tDataLength = tFindFirstPixelData(pFile, tMaxBytes, &tSkipped);
00176 if (tDataLength == (size_t)-1) {
00177 return FALSE;
00178 }
00179
00180 vImagePrologue(pDiag, pImg);
00181 do {
00182 tMaxBytes -= tSkipped;
00183 vASCII85EncodeArray(pFile, pDiag->pOutFile, tDataLength);
00184 tMaxBytes -= tDataLength;
00185 tDataLength = tFindNextPixelData(pFile, tMaxBytes, &tSkipped);
00186 } while (tDataLength != (size_t)-1);
00187 vASCII85EncodeByte(pDiag->pOutFile, EOF);
00188 vImageEpilogue(pDiag);
00189
00190 return TRUE;
00191 }