WP2LaTeX sources.
Revision | 3918dc4cb9e4a7abbeb555dad8d18dfc93bf2aff (tree) |
---|---|
Time | 2022-11-12 07:14:06 |
Author | Fojtik |
Commiter | Fojtik |
Fix deffect in EPS reader; do not consume too much bytes (full HDU) on stack for FITS reader.
@@ -816,7 +816,7 @@ | ||
816 | 816 | ConvertMe->Set(*CurrImg->Raster->GetRowRaster(i)); |
817 | 817 | fwrite(ConvertMe->Data1D,ldblk,1,f); |
818 | 818 | } |
819 | - else | |
819 | + else // Direct support. | |
820 | 820 | { |
821 | 821 | if(StoredPlanes==24) RGB_BGR((char *)CurrImg->Raster->GetRow(i),CurrImg->Raster->GetSize1D()); |
822 | 822 | fwrite(CurrImg->Raster->GetRow(i),ldblk,1,f); |
@@ -1289,11 +1289,11 @@ | ||
1289 | 1289 | { |
1290 | 1290 | if(!strcmp(a,"/cmap")) |
1291 | 1291 | { |
1292 | - i=ftell(F); | |
1293 | - planes=ReadInt(F,&ch); | |
1294 | - if(planes>0 && planes<=256) | |
1292 | + i = ftell(F); | |
1293 | + planes = ReadInt(F,&ch); | |
1294 | + if(planes>0 && planes/3<=256) | |
1295 | 1295 | { |
1296 | - Palette=BuildPalette(planes/3,8); | |
1296 | + Palette = BuildPalette(planes/3,8); | |
1297 | 1297 | } |
1298 | 1298 | fseek(F,i,SEEK_SET); |
1299 | 1299 | } |
@@ -2002,7 +2002,7 @@ | ||
2002 | 2002 | /** This procedure process one separate fits file. */ |
2003 | 2003 | Image LoadPictureFITS(const char *Name) |
2004 | 2004 | { |
2005 | -char HDU[36][80]; | |
2005 | +char HDU_LINE[80]; | |
2006 | 2006 | char identifier[80]; |
2007 | 2007 | char value[80]; |
2008 | 2008 | char comment[80]; |
@@ -2030,21 +2030,20 @@ | ||
2030 | 2030 | memset(Axes,0,sizeof(Axes)); |
2031 | 2031 | // memset(&attr,0,sizeof(attr)); |
2032 | 2032 | Naxis = 0; |
2033 | - memset(HDU,0,sizeof(HDU)); | |
2033 | + memset(HDU_LINE,0,sizeof(HDU_LINE)); | |
2034 | 2034 | |
2035 | 2035 | while(!feof(F)) |
2036 | + { | |
2037 | + for(int i=0; i<36; i++) // Parse separate rows in HDU. | |
2036 | 2038 | { |
2037 | - if(fread(HDU,sizeof(HDU),1,F)!=1) | |
2038 | - break; | |
2039 | - | |
2040 | - for(int i=0; i<36; i++) // parse separate rows | |
2041 | - { | |
2039 | + if(fread(HDU_LINE,sizeof(HDU_LINE)-1,1,F) != 1) goto ExitPoint; | |
2040 | + | |
2042 | 2041 | *identifier = *value = *comment = 0; |
2043 | 2042 | // parse identifier |
2044 | 2043 | pos=0; j=0; |
2045 | 2044 | while(j<sizeof(identifier)-1) |
2046 | 2045 | { |
2047 | - c = HDU[i][j++]; | |
2046 | + c = HDU_LINE[j++]; | |
2048 | 2047 | if(isspace((unsigned char)c)) continue; |
2049 | 2048 | if(c=='=') break; |
2050 | 2049 | if(c=='/') goto COMMENT; |
@@ -2057,7 +2056,7 @@ | ||
2057 | 2056 | pos = 0; |
2058 | 2057 | while(j<80) |
2059 | 2058 | { |
2060 | - c = HDU[i][j++]; | |
2059 | + c = HDU_LINE[j++]; | |
2061 | 2060 | if(isspace((unsigned char)c) && *value==0) continue; |
2062 | 2061 | if(c=='/') break; |
2063 | 2062 | value[pos++] = c; |
@@ -2074,7 +2073,7 @@ | ||
2074 | 2073 | pos = 0; |
2075 | 2074 | while(j<80) |
2076 | 2075 | { |
2077 | - c = HDU[i][j++]; | |
2076 | + c = HDU_LINE[j++]; | |
2078 | 2077 | if(isspace((unsigned char)c) && *comment==0) continue; |
2079 | 2078 | comment[pos++] = c; |
2080 | 2079 | comment[pos] = 0; |
@@ -2173,14 +2172,14 @@ | ||
2173 | 2172 | |
2174 | 2173 | if(Naxis==2) |
2175 | 2174 | { |
2176 | - Raster=CreateRaster2D(Axes[0],Axes[1],BitPix); | |
2175 | + Raster = CreateRaster2D(Axes[0],Axes[1],BitPix); | |
2177 | 2176 | if(Raster==NULL) goto ExitPoint; |
2178 | 2177 | |
2179 | 2178 | ldblk = (labs(Raster->GetPlanes())*Raster->GetSize1D()+7)/8; |
2180 | 2179 | for(j=0; j<Raster->Size2D; j++) |
2181 | 2180 | { |
2182 | 2181 | if(fread(Raster->GetRow(Raster->Size2D-j-1),ldblk,1,F)!=1) {goto ExitPoint;} |
2183 | - if(Endian == 1) //!!! chyba !!! | |
2182 | + if(Endian == 1) // Error, this works on low endian architecture only. | |
2184 | 2183 | { |
2185 | 2184 | switch(BitPix) |
2186 | 2185 | { |
@@ -2190,6 +2189,8 @@ | ||
2190 | 2189 | case 32: FixSignedMSBValues((BYTE*)Raster->GetRow(Raster->Size2D-j-1), Raster->GetSize1D(), 4); |
2191 | 2190 | case -32: swab32((BYTE*)Raster->GetRow(Raster->Size2D-j-1),Raster->GetSize1D()); |
2192 | 2191 | break; |
2192 | + case 16: swab16((BYTE*)Raster->GetRow(Raster->Size2D-j-1),Raster->GetSize1D()); | |
2193 | + break; | |
2193 | 2194 | } |
2194 | 2195 | } |
2195 | 2196 | else |
@@ -2202,6 +2203,19 @@ | ||
2202 | 2203 | |
2203 | 2204 | // AlineProc(j,p); |
2204 | 2205 | } |
2206 | + } else if(Naxis==3) | |
2207 | + { | |
2208 | + if(Axes[0]==3 && (BitPix==8 || BitPix==16)) // This is considered as RGB. | |
2209 | + { | |
2210 | + Raster = CreateRaster2DRGB(Axes[1],Axes[2],BitPix); | |
2211 | + if(Raster==NULL) goto ExitPoint; | |
2212 | + | |
2213 | + ldblk = (labs(Raster->GetPlanes())*Raster->GetSize1D()+7)/8; | |
2214 | + for(j=0; j<Raster->Size2D; j++) | |
2215 | + { | |
2216 | + if(fread(Raster->GetRow(Raster->Size2D-j-1),ldblk,1,F)!=1) {goto ExitPoint;} | |
2217 | + } | |
2218 | + } | |
2205 | 2219 | } |
2206 | 2220 | |
2207 | 2221 | Img.AttachRaster(Raster); |
@@ -2252,6 +2266,7 @@ | ||
2252 | 2266 | FILE *f; |
2253 | 2267 | char HDU[36][80]; |
2254 | 2268 | char depth; |
2269 | +char channels; | |
2255 | 2270 | Raster1DAbstract *RPixels = NULL; |
2256 | 2271 | unsigned ldblk; |
2257 | 2272 | unsigned y; |
@@ -2261,11 +2276,19 @@ | ||
2261 | 2276 | /* Open output image file. */ |
2262 | 2277 | if((f=fopen(Name,"wb"))==NULL) return(-1); |
2263 | 2278 | |
2264 | - if(Img.Raster->GetPlanes() > 8) | |
2279 | + channels = 1; | |
2280 | + depth = Img.Raster->GetPlanes(); | |
2281 | + | |
2282 | + if(depth > 8) | |
2265 | 2283 | { |
2266 | - if(Img.Raster->GetPlanes() > 16) | |
2284 | + if(depth > 16) | |
2267 | 2285 | { |
2268 | - if(Img.Raster->GetPlanes() > 32) | |
2286 | + if(Img.Raster->Channels()==3 && depth==24) | |
2287 | + { | |
2288 | + depth = 8; | |
2289 | + channels = 3; | |
2290 | + } | |
2291 | + else if(depth > 32) | |
2269 | 2292 | depth=64; |
2270 | 2293 | else |
2271 | 2294 | depth=32; |
@@ -2276,7 +2299,7 @@ | ||
2276 | 2299 | else |
2277 | 2300 | depth=8; |
2278 | 2301 | |
2279 | - ldblk = Img.Raster->GetSize1D() * (depth/8); | |
2302 | + ldblk = Img.Raster->GetSize1D() * ((depth*channels)/8); | |
2280 | 2303 | switch(Img.Raster->GetPlanes()) |
2281 | 2304 | { |
2282 | 2305 | case -64:ldblk = Img.Raster->GetSize1D()*8; depth=-64; break; |
@@ -2284,7 +2307,9 @@ | ||
2284 | 2307 | case 8: break; |
2285 | 2308 | case 16: break; |
2286 | 2309 | case 32: break; |
2287 | - case 64: break; // no pixels intermediate buffer needed | |
2310 | + case 64: break; // no pixels intermediate buffer needed | |
2311 | + case 24: if(channels==3) break; | |
2312 | + // fallback, use conversion for 24bit gray | |
2288 | 2313 | default: RPixels = CreateRaster1D(Img.Raster->GetSize1D(), depth); |
2289 | 2314 | if(RPixels->Data1D==NULL) goto FINISH; |
2290 | 2315 | } |
@@ -2294,14 +2319,28 @@ | ||
2294 | 2319 | InsertRowHDU(HDU[0], "SIMPLE = T"); |
2295 | 2320 | y = sprintf(HDU[1], "BITPIX = %d", (int)depth); |
2296 | 2321 | HDU[1][y] = ' '; |
2297 | - InsertRowHDU(HDU[2], "NAXIS = 2"); | |
2298 | - y = sprintf(HDU[3], "NAXIS1 = %10lu",(unsigned long)Img.Raster->GetSize1D()); | |
2299 | - HDU[3][y] = ' '; | |
2300 | - y = sprintf(HDU[4], "NAXIS2 = %10lu",(unsigned long)Img.Raster->Size2D); | |
2301 | - HDU[4][y] = ' '; | |
2322 | + if(channels>1) | |
2323 | + { | |
2324 | + InsertRowHDU(HDU[2], "NAXIS = 3"); | |
2325 | + y = sprintf(HDU[3], "NAXIS1 = %u", (unsigned long)channels); | |
2326 | + HDU[3][y] = ' '; | |
2327 | + y = sprintf(HDU[4], "NAXIS2 = %10lu",(unsigned long)Img.Raster->GetSize1D()); | |
2328 | + HDU[4][y] = ' '; | |
2329 | + y = sprintf(HDU[5], "NAXIS3 = %10lu",(unsigned long)Img.Raster->Size2D); | |
2330 | + HDU[5][y] = ' '; | |
2331 | + } | |
2332 | + else | |
2333 | + { | |
2334 | + InsertRowHDU(HDU[2], "NAXIS = 2"); | |
2335 | + y = sprintf(HDU[3], "NAXIS1 = %10lu",(unsigned long)Img.Raster->GetSize1D()); | |
2336 | + HDU[3][y] = ' '; | |
2337 | + y = sprintf(HDU[4], "NAXIS2 = %10lu",(unsigned long)Img.Raster->Size2D); | |
2338 | + HDU[4][y] = ' '; | |
2339 | + } | |
2302 | 2340 | |
2303 | 2341 | { |
2304 | 2342 | int row = 5; |
2343 | + if(channels>1) row=6; | |
2305 | 2344 | |
2306 | 2345 | if(Img.Raster->GetPlanes()<0) |
2307 | 2346 | { |
@@ -2328,7 +2367,7 @@ | ||
2328 | 2367 | if(depth==64) |
2329 | 2368 | y = sprintf(HDU[row], "DATAMAX = 9223372036854775807"); // "DATAMAX = %19llu",0x7FFFFFFFFFFFFFFFll); |
2330 | 2369 | else |
2331 | - y = sprintf(HDU[row], "DATAMAX = %10lu",(unsigned long)1<<Img.Raster->GetPlanes()); | |
2370 | + y = sprintf(HDU[row], "DATAMAX = %10lu",(unsigned long)1<<(Img.Raster->GetPlanes()/channels)); | |
2332 | 2371 | |
2333 | 2372 | HDU[row++][y] = ' '; |
2334 | 2373 | } |
@@ -2361,9 +2400,9 @@ | ||
2361 | 2400 | swab32((BYTE *)Img.Raster->GetRow(y), Img.Raster->GetSize1D()); |
2362 | 2401 | if(depth==32) |
2363 | 2402 | FixSignedMSBValues((BYTE *)Img.Raster->GetRow(y), Img.Raster->GetSize1D(), 4); |
2364 | - | |
2403 | + | |
2365 | 2404 | fwrite(Img.Raster->GetRow(y),ldblk,1,f); |
2366 | - | |
2405 | + | |
2367 | 2406 | if(depth==64) |
2368 | 2407 | FixSignedMSBValues((BYTE *)Img.Raster->GetRow(y), Img.Raster->GetSize1D(), 8); |
2369 | 2408 | if(depth==-64 || depth==64) |
@@ -17,8 +17,8 @@ | ||
17 | 17 | |
18 | 18 | #define LineLength 80 /* Split lines after more than LineLength charcters */ |
19 | 19 | |
20 | -#define VersionWP2L "3.110" | |
21 | -#define VersionDate "7 Nov 2022" /* day (space) month (space) full year */ | |
20 | +#define VersionWP2L "3.pre111" | |
21 | +#define VersionDate "11 Nov 2022" /* day (space) month (space) full year */ | |
22 | 22 | |
23 | 23 | |
24 | 24 | /* Constants for a flag InputPS */ |