WP2LaTeX sources.
Revision | d133927d4930223a9c337e4d84c4a05e57946c64 (tree) |
---|---|
Zeit | 2022-11-21 18:02:03 |
Autor | Fojtik |
Commiter | Fojtik |
Remove abundant stricmp define fix. Fix palette storing into PCX.
@@ -9,16 +9,6 @@ | ||
9 | 9 | #include "common.h" |
10 | 10 | #include "raster.h" |
11 | 11 | |
12 | -#ifndef __Have_stricmp | |
13 | - #ifdef __Have_strcasecmp | |
14 | - #define stricmp strcasecmp | |
15 | - #endif | |
16 | - #ifndef stricmp //already fixed? | |
17 | - #define stricmp strcmp | |
18 | - #endif | |
19 | -#endif | |
20 | - | |
21 | - | |
22 | 12 | |
23 | 13 | /** This class is a container for loader modules. */ |
24 | 14 | TImageFileHandler *TImageFileHandler::First=NULL; |
@@ -109,7 +99,7 @@ | ||
109 | 99 | { |
110 | 100 | if(LoadPicture_XXX->LoadPicture!=NULL) |
111 | 101 | { |
112 | - Img=LoadPicture_XXX->LoadPicture(Name); | |
102 | + Img = LoadPicture_XXX->LoadPicture(Name); | |
113 | 103 | if(Img.Raster!=NULL) return(Img); |
114 | 104 | } |
115 | 105 | } |
@@ -309,11 +309,11 @@ | ||
309 | 309 | #else |
310 | 310 | NULL, |
311 | 311 | #endif |
312 | - //#if SupportRAS_SUN>=3 | |
313 | - // SavePictureRAS_SUN); | |
314 | - //#else | |
312 | + #if SupportRAS_SUN>=3 | |
313 | + SavePictureRAS_SUN, | |
314 | + #else | |
315 | 315 | NULL, |
316 | - //#endif | |
316 | + #endif | |
317 | 317 | "SUN"); |
318 | 318 | #endif |
319 | 319 |
@@ -550,7 +550,7 @@ | ||
550 | 550 | i--; |
551 | 551 | } |
552 | 552 | continue; |
553 | - }; | |
553 | + } | |
554 | 554 | |
555 | 555 | if(x>=ldblk) |
556 | 556 | continue; |
@@ -564,10 +564,10 @@ | ||
564 | 564 | x+=k; |
565 | 565 | i-=k; |
566 | 566 | } |
567 | - }; | |
567 | + } | |
568 | 568 | // if AlineProc<>nil then AlineProc^.NextLine; |
569 | 569 | if(feof(f)) goto End_of_bitmap; //unexpected end |
570 | - }; | |
570 | + } | |
571 | 571 | break; |
572 | 572 | } |
573 | 573 |
@@ -592,7 +592,7 @@ | ||
592 | 592 | x+=i&0xFF; |
593 | 593 | y-=(i>>8)-1; |
594 | 594 | break; |
595 | - }; | |
595 | + } | |
596 | 596 | |
597 | 597 | k=0; |
598 | 598 | ldblk=0; |
@@ -606,7 +606,7 @@ | ||
606 | 606 | case 1:Raster->SetValue2D(x,y,ldblk & 0xF);break; |
607 | 607 | case 2:Raster->SetValue2D(x,y,ldblk >> 12);break; |
608 | 608 | case 3:Raster->SetValue2D(x,y,(ldblk >> 8) & 0xF);break; |
609 | - }; | |
609 | + } | |
610 | 610 | x++; |
611 | 611 | i--; |
612 | 612 | k=(k+1) & 3; |
@@ -1091,7 +1091,7 @@ | ||
1091 | 1091 | RunCount=fgetc(f); |
1092 | 1092 | if(feof(f)) goto Finish; /*wrong data: unexpected eof in line*/ |
1093 | 1093 | RunCountMasked=RunCount & 0x7F; |
1094 | - }; | |
1094 | + } | |
1095 | 1095 | if(EncodedByte!=1) goto Finish; /*wrong data: size incorrect*/ |
1096 | 1096 | i=0; /*guess a number of bit planes*/ |
1097 | 1097 | if(ldblk==Header.width) i=8; |
@@ -1209,7 +1209,7 @@ | ||
1209 | 1209 | Img.AttachRaster(Raster); |
1210 | 1210 | Img.AttachPalette(Palette); |
1211 | 1211 | return(Img); |
1212 | -}; /*LoadCUT*/ | |
1212 | +} /*LoadCUT*/ | |
1213 | 1213 | |
1214 | 1214 | #endif |
1215 | 1215 |
@@ -3279,12 +3279,14 @@ | ||
3279 | 3279 | t->tm_hour,t->tm_min,t->tm_sec, |
3280 | 3280 | t->tm_year+1900); |
3281 | 3281 | Header[0x7D]=1; |
3282 | - Header[0x7E]='I'; | |
3283 | - Header[0x7F]='M'; | |
3282 | + *(WORD*)(Header+0x7E) = 'I' + 256*'M'; // This will work on both endian architectures. | |
3283 | + //Header[0x7E]='I'; Intel low endian result. | |
3284 | + //Header[0x7F]='M'; | |
3284 | 3285 | } |
3285 | 3286 | |
3286 | 3287 | |
3287 | -/**This procedure saves image data into MATLAB MAT file*/ | |
3288 | +/**This procedure saves image data into MATLAB MAT file. | |
3289 | + * Please note that MAT file is stored in native endian. */ | |
3288 | 3290 | int SavePictureMAT(const char *Name, const Image &Img) |
3289 | 3291 | { |
3290 | 3292 | FILE *f; |
@@ -3300,27 +3302,27 @@ | ||
3300 | 3302 | char MATLAB_HDR[184]; |
3301 | 3303 | DWORD DataSize; |
3302 | 3304 | |
3303 | - DataSize=(DWORD)Img.Raster->GetSize1D() * (DWORD)Img.Raster->Size2D; | |
3305 | + DataSize = (DWORD)Img.Raster->GetSize1D() * (DWORD)Img.Raster->Size2D; | |
3304 | 3306 | |
3305 | 3307 | memset(MATLAB_HDR,' ',124); |
3306 | 3308 | memset(MATLAB_HDR+124,0,sizeof(MATLAB_HDR)-124); |
3307 | 3309 | |
3308 | 3310 | BuildMAT_TXT(MATLAB_HDR); |
3309 | 3311 | |
3310 | - *(DWORD *)&(MATLAB_HDR[0x80])=miMATRIX; | |
3311 | - MATLAB_HDR[0x88]=0x6; | |
3312 | - MATLAB_HDR[0x8C]=mxUINT8_CLASS; | |
3313 | - MATLAB_HDR[0x90]=0x6; | |
3314 | - MATLAB_HDR[0x98]=0x5; | |
3315 | - MATLAB_HDR[0x9C] = IsColor?12:0x8; //DimFlag | |
3312 | + *(DWORD *)&(MATLAB_HDR[0x80]) = miMATRIX; | |
3313 | + *(DWORD *)&(MATLAB_HDR[0x88]) = 0x6; | |
3314 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxUINT8_CLASS; | |
3315 | + *(DWORD *)&(MATLAB_HDR[0x90]) = 0x6; | |
3316 | + *(DWORD *)&(MATLAB_HDR[0x98]) = 0x5; | |
3317 | + *(DWORD *)&(MATLAB_HDR[0x9C]) = IsColor?12:0x8; //DimFlag | |
3316 | 3318 | *(DWORD *)&(MATLAB_HDR[0xA0])=Img.Raster->Size2D; //Rotate image 90 degs |
3317 | 3319 | *(DWORD *)&(MATLAB_HDR[0xA4])=Img.Raster->GetSize1D(); //Rotate image 90 degs |
3318 | - MATLAB_HDR[0xA8]=1; | |
3319 | - MATLAB_HDR[0xAA]=1; //NameFlag | |
3320 | - MATLAB_HDR[0xAC]='M'; //matrix name | |
3320 | + *(WORD *)&(MATLAB_HDR[0xA8]) = 1; | |
3321 | + *(WORD *)&(MATLAB_HDR[0xAA]) = 1; //NameFlag | |
3322 | + *(DWORD *)&(MATLAB_HDR[0xAC]) = 'M'; //matrix name | |
3321 | 3323 | if(IsColor) |
3322 | 3324 | { |
3323 | - MATLAB_HDR[0xB0]=miUINT8; //BYTE | |
3325 | + *(DWORD *)&(MATLAB_HDR[0xB0]) = miUINT8; //BYTE | |
3324 | 3326 | DataSize *= 3; |
3325 | 3327 | } |
3326 | 3328 | else |
@@ -3330,34 +3332,34 @@ | ||
3330 | 3332 | case 1: |
3331 | 3333 | case 2: |
3332 | 3334 | case 4: |
3333 | - case 8: MATLAB_HDR[0xB0]=miUINT8; | |
3334 | - MATLAB_HDR[0x8C]=mxUINT8_CLASS; | |
3335 | + case 8: *(DWORD *)&(MATLAB_HDR[0xB0]) = miUINT8; | |
3336 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxUINT8_CLASS; | |
3335 | 3337 | break; //BYTE |
3336 | - case 16: MATLAB_HDR[0xB0]=miUINT16; | |
3337 | - MATLAB_HDR[0x8C]=mxUINT16_CLASS; | |
3338 | + case 16: *(DWORD *)&(MATLAB_HDR[0xB0]) = miUINT16; | |
3339 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxUINT16_CLASS; | |
3338 | 3340 | DataSize *= 2; |
3339 | 3341 | break; //WORD |
3340 | 3342 | case 24: |
3341 | - case 32: MATLAB_HDR[0xB0]=miUINT32; | |
3342 | - MATLAB_HDR[0x8C]=mxUINT32_CLASS; | |
3343 | + case 32: *(DWORD *)&(MATLAB_HDR[0xB0]) = miUINT32; | |
3344 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxUINT32_CLASS; | |
3343 | 3345 | DataSize *= 4; |
3344 | 3346 | break; //DWORD |
3345 | - case -32:MATLAB_HDR[0xB0]=miSINGLE; | |
3346 | - MATLAB_HDR[0x8C]=mxSINGLE_CLASS; | |
3347 | + case -32:*(DWORD *)&(MATLAB_HDR[0xB0]) = miSINGLE; | |
3348 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxSINGLE_CLASS; | |
3347 | 3349 | DataSize *= 4; |
3348 | 3350 | break; |
3349 | - case -64:MATLAB_HDR[0xB0]=miDOUBLE; | |
3350 | - MATLAB_HDR[0x8C]=mxDOUBLE_CLASS; | |
3351 | + case -64:*(DWORD *)&(MATLAB_HDR[0xB0]) = miDOUBLE; | |
3352 | + *(DWORD *)&(MATLAB_HDR[0x8C]) = mxDOUBLE_CLASS; | |
3351 | 3353 | DataSize *= 8; |
3352 | 3354 | break; |
3353 | 3355 | default: goto FINISH; |
3354 | 3356 | } |
3355 | 3357 | } |
3356 | 3358 | |
3357 | - padding=((BYTE)(DataSize-1) & 0x7) ^ 0x7; | |
3359 | + padding = ((BYTE)(DataSize-1) & 0x7) ^ 0x7; | |
3358 | 3360 | *(DWORD *)&(MATLAB_HDR[0x84]) = DataSize + 56l + (DWORD)padding; |
3359 | 3361 | |
3360 | - *(DWORD *)&(MATLAB_HDR[0xB4])=DataSize; | |
3362 | + *(DWORD *)&(MATLAB_HDR[0xB4]) = DataSize; | |
3361 | 3363 | |
3362 | 3364 | unsigned ix; |
3363 | 3365 | if(IsColor) |
@@ -3389,7 +3391,7 @@ | ||
3389 | 3391 | { |
3390 | 3392 | fwrite(MATLAB_HDR,1,sizeof(MATLAB_HDR),f); |
3391 | 3393 | |
3392 | - switch(MATLAB_HDR[0xB0]) | |
3394 | + switch(*(DWORD*)&(MATLAB_HDR[0xB0])) | |
3393 | 3395 | { |
3394 | 3396 | case miUINT8: |
3395 | 3397 | { |
@@ -3743,6 +3745,9 @@ | ||
3743 | 3745 | |
3744 | 3746 | //-----------------------PCX------------------------------ |
3745 | 3747 | #ifdef SupportPCX |
3748 | + | |
3749 | +// http://fileformats.archiveteam.org/wiki/PCX | |
3750 | + | |
3746 | 3751 | struct RGBColor |
3747 | 3752 | { |
3748 | 3753 | BYTE Red,Green,Blue; |
@@ -3849,7 +3854,7 @@ | ||
3849 | 3854 | { |
3850 | 3855 | Cnt=C & 0x3F; |
3851 | 3856 | fread(&C,1,1,f); |
3852 | - }; | |
3857 | + } | |
3853 | 3858 | RestOfLast: |
3854 | 3859 | while(Cnt>0) |
3855 | 3860 | { |
@@ -3876,7 +3881,7 @@ | ||
3876 | 3881 | } |
3877 | 3882 | if((Header.BitPerPix==8)&&(Raster->GetPlanes()==24)) |
3878 | 3883 | { /*RGB image*/ |
3879 | -// if not aplane in [1,2,3] asm int 3; }; | |
3884 | +// if not aplane in [1,2,3] asm int 3; } | |
3880 | 3885 | Raster->GetRowRaster(Y)->Join8Bit(data,Raster->GetPlanes()-8*Aplane); |
3881 | 3886 | } |
3882 | 3887 | } |
@@ -3950,7 +3955,7 @@ | ||
3950 | 3955 | const int Mask=0xC0; |
3951 | 3956 | const int MaxCnt=63; |
3952 | 3957 | FILE *F; |
3953 | -WORD X,Y,OC,C,Cnt; | |
3958 | +WORD X,Y,Cnt; | |
3954 | 3959 | PCXHeader PCXFile; |
3955 | 3960 | BYTE *data; |
3956 | 3961 | BYTE *ptrb; |
@@ -3959,6 +3964,7 @@ | ||
3959 | 3964 | BYTE Aplane; |
3960 | 3965 | APalette *Palette=NULL; |
3961 | 3966 | int k; |
3967 | +BYTE C, OC; | |
3962 | 3968 | |
3963 | 3969 | if(Img.Raster==NULL) return(-10); |
3964 | 3970 |
@@ -3982,14 +3988,14 @@ | ||
3982 | 3988 | case 1:if(Img.Palette!=NULL && Img.Palette->Size1D>=2) |
3983 | 3989 | { |
3984 | 3990 | PCXFile.NumPlanes = 2; // Palette cannot be displayed in 1 plane bilevel mode, add a dummy plane. |
3985 | - C = 3*2; | |
3991 | + C = 2; | |
3986 | 3992 | goto InternalPalette; |
3987 | 3993 | } |
3988 | 3994 | PCXFile.BytesPerLine = (PCXFile.BytesPerLine+7) >> 3; |
3989 | 3995 | break; |
3990 | - case 2:C = 3*4; | |
3996 | + case 2:C = 4; | |
3991 | 3997 | goto InternalPalette; |
3992 | - case 4:C = 3*16; | |
3998 | + case 4:C = 16; | |
3993 | 3999 | InternalPalette: |
3994 | 4000 | bbuf=(BYTE *)malloc((Img.Raster->GetSize1D()+7) >> 3); |
3995 | 4001 | PCXFile.BytesPerLine=(PCXFile.BytesPerLine+7) >> 3; |
@@ -3999,16 +4005,25 @@ | ||
3999 | 4005 | Palette = BuildPalette(1<<Img.Raster->GetPlanes(),8); |
4000 | 4006 | PCXFile.PaletteInfo = 2; |
4001 | 4007 | } |
4002 | - memcpy(&PCXFile.ColorMap,Palette->Data1D,C); // TODO: This is wrong! | |
4008 | + while(C-->0) | |
4009 | + { | |
4010 | + PCXFile.ColorMap[C].Red = Palette->R(C); | |
4011 | + PCXFile.ColorMap[C].Green = Palette->G(C); | |
4012 | + PCXFile.ColorMap[C].Blue = Palette->B(C); | |
4013 | + } | |
4003 | 4014 | if(Palette!=Img.Palette) delete Palette; |
4004 | 4015 | Palette=NULL; |
4005 | 4016 | break; |
4006 | 4017 | case 8:PCXFile.BitPerPix = 8; |
4007 | 4018 | PCXFile.NumPlanes = 1; |
4008 | 4019 | break; |
4009 | - case 24:PCXFile.BitPerPix = 8; | |
4020 | + case 24:PCXFile.BitPerPix = 8; // RGB format | |
4010 | 4021 | PCXFile.NumPlanes = 3; |
4011 | - bbuf=(BYTE *)malloc(Img.Raster->GetSize1D()); | |
4022 | + bbuf = (BYTE *)malloc(Img.Raster->GetSize1D()); | |
4023 | + break; | |
4024 | + case 32:PCXFile.BitPerPix = 8; // RGBA format | |
4025 | + PCXFile.NumPlanes = 4; | |
4026 | + bbuf = (BYTE *)malloc(Img.Raster->GetSize1D()); | |
4012 | 4027 | break; |
4013 | 4028 | default:return(-2); |
4014 | 4029 | } |
@@ -4065,7 +4080,7 @@ | ||
4065 | 4080 | } |
4066 | 4081 | data[datapos]=OC; |
4067 | 4082 | datapos++; |
4068 | - Cnt=0; | |
4083 | + Cnt = 0; | |
4069 | 4084 | } |
4070 | 4085 | fwrite(data,datapos,1,F); |
4071 | 4086 | } |
@@ -4091,9 +4106,9 @@ | ||
4091 | 4106 | k = Palette->GetPlanes()/3 - 8; |
4092 | 4107 | if(k<0) k = 0; |
4093 | 4108 | |
4094 | - fputc(12,F); //{paleta} | |
4095 | - | |
4096 | - for(X=0;X<=255;X++) | |
4109 | + fputc(12,F); // palette | |
4110 | + | |
4111 | + for(X=0; X<=255; X++) | |
4097 | 4112 | { |
4098 | 4113 | fputc(Palette->R(X)>>k,F); //Red; |
4099 | 4114 | fputc(Palette->G(X)>>k,F); //Green; |
@@ -4118,7 +4133,7 @@ | ||
4118 | 4133 | //-------------------------RAS-TopoL----------------------- |
4119 | 4134 | #ifdef SupportRAS |
4120 | 4135 | |
4121 | -struct RasHeader | |
4136 | +struct TopolRasHeader | |
4122 | 4137 | { |
4123 | 4138 | char Name[20]; |
4124 | 4139 | SWORD Rows; |
@@ -4154,7 +4169,9 @@ | ||
4154 | 4169 | }; |
4155 | 4170 | |
4156 | 4171 | |
4157 | -inline long LoadTopolHeader(FILE *f, RasHeader &SU) | |
4172 | +#if SupportRAS>=4 || SupportRAS==2 | |
4173 | + | |
4174 | +inline long LoadTopolHeader(FILE *f, TopolRasHeader &SU) | |
4158 | 4175 | { |
4159 | 4176 | #if defined(__PackedStructures__) |
4160 | 4177 | return(fread(&SU,1,sizeof(SU),f)); |
@@ -4168,20 +4185,19 @@ | ||
4168 | 4185 | #endif |
4169 | 4186 | } |
4170 | 4187 | |
4171 | -#if SupportRAS>=4 || SupportRAS==2 | |
4172 | 4188 | Image LoadPictureRAS(const char *Name) |
4173 | 4189 | { |
4174 | 4190 | FILE *f; |
4175 | 4191 | WORD Ldblk; |
4176 | 4192 | WORD j,i,k; |
4177 | -RasHeader Header; | |
4193 | +TopolRasHeader Header; | |
4178 | 4194 | Image Img; |
4179 | 4195 | Raster2DAbstract *Raster=NULL; |
4180 | 4196 | APalette *Palette=NULL; |
4181 | 4197 | char *NameBuffer=NULL; |
4182 | 4198 | DWORD *Offsets=NULL; |
4183 | -WORD TilesAcross,TilesDown; | |
4184 | -WORD TilX,TilY; | |
4199 | +WORD TilesAcross, TilesDown; | |
4200 | +WORD TilX, TilY; | |
4185 | 4201 | |
4186 | 4202 | if((f=fopen(Name,"rb"))==NULL) return(Img); |
4187 | 4203 |
@@ -4193,7 +4209,7 @@ | ||
4193 | 4209 | if(Header.Name[i]<' ') goto FINISH; |
4194 | 4210 | } |
4195 | 4211 | if(Header.Komprese!=0) goto FINISH; |
4196 | - if(Header.Rows==0 || Header.Cols==0 ) goto FINISH; | |
4212 | + if(Header.Rows<=0 || Header.Cols<=0 ) goto FINISH; | |
4197 | 4213 | if(Header.Verze>2) goto FINISH; //unknown version |
4198 | 4214 | |
4199 | 4215 | switch(Header.TypSou) |
@@ -4359,24 +4375,38 @@ | ||
4359 | 4375 | } |
4360 | 4376 | MezFail: |
4361 | 4377 | |
4362 | - | |
4363 | 4378 | FINISH: |
4364 | 4379 | if(f) fclose(f); |
4365 | 4380 | if(NameBuffer) {free(NameBuffer);NameBuffer=NULL;} |
4366 | 4381 | Img.AttachRaster(Raster); |
4367 | - Img.AttachPalette(Palette); | |
4382 | + Img.AttachPalette(Palette); | |
4368 | 4383 | return(Img); |
4369 | 4384 | } |
4370 | 4385 | #endif |
4371 | 4386 | |
4372 | 4387 | |
4373 | 4388 | #if SupportRAS>=3 |
4389 | + | |
4390 | +inline long SaveTopolHeader(FILE *f, TopolRasHeader &SU) | |
4391 | +{ | |
4392 | +#if defined(__PackedStructures__) | |
4393 | + return(fwrite(&SU,1,sizeof(SU),f)); | |
4394 | +#else | |
4395 | + return(savestruct(f,"a20wwwdwwwqqqqqwwddba423", | |
4396 | + SU.Name,SU.Rows,SU.Cols,SU.TypSou,SU.Zoom,SU.Verze, | |
4397 | + SU.Komprese,SU.Stav, | |
4398 | + SU.xRasMin,SU.yRasMin,SU.xRasMax,SU.yRasMax,SU.Scale, //from release 2 | |
4399 | + SU.TileWidth,SU.TileHeight,SU.TileOffsets,SU.TileByteCounts, | |
4400 | + SU.TileCompression,SU.Dummy)); | |
4401 | +#endif | |
4402 | +} | |
4403 | + | |
4374 | 4404 | int SavePictureRAS(const char *Name,const Image &Img) |
4375 | 4405 | { |
4376 | 4406 | FILE *f; |
4377 | 4407 | WORD Ldblk; |
4378 | 4408 | WORD i; |
4379 | -RasHeader Header; | |
4409 | +TopolRasHeader Header; | |
4380 | 4410 | paletteRAS pal; |
4381 | 4411 | char *PalName=NULL; |
4382 | 4412 |
@@ -4384,8 +4414,8 @@ | ||
4384 | 4414 | |
4385 | 4415 | memset(&Header,0,sizeof(Header)); |
4386 | 4416 | memset(&Header.Name,' ',sizeof(Header.Name)); |
4387 | - Header.Cols=Img.Raster->GetSize1D(); | |
4388 | - Header.Rows=Img.Raster->Size2D; | |
4417 | + Header.Cols = Img.Raster->GetSize1D(); | |
4418 | + Header.Rows = Img.Raster->Size2D; | |
4389 | 4419 | switch(Img.Raster->GetPlanes()) |
4390 | 4420 | { |
4391 | 4421 | case 1:Header.TypSou=0; |
@@ -4405,10 +4435,10 @@ | ||
4405 | 4435 | |
4406 | 4436 | if((f=fopen(Name,"wb"))==NULL) return(-1); |
4407 | 4437 | |
4408 | - fwrite(&Header,sizeof(Header),1,f); | |
4409 | - | |
4410 | - fseek(f,0x200,SEEK_SET); | |
4411 | - Ldblk=((long)Img.Raster->GetPlanes()*Img.Raster->GetSize1D()+7) / 8; | |
4438 | + i = SaveTopolHeader(f,Header); | |
4439 | + if(i!=512) {fclose(f);return -3;} | |
4440 | + | |
4441 | + Ldblk = ((long)Img.Raster->GetPlanes()*Img.Raster->GetSize1D()+7) / 8; | |
4412 | 4442 | for(i=0;i<Header.Rows;i++) |
4413 | 4443 | { |
4414 | 4444 | fwrite(Img.Raster->GetRow(i),Ldblk,1,f); |
@@ -4432,10 +4462,10 @@ | ||
4432 | 4462 | } |
4433 | 4463 | free(PalName); |
4434 | 4464 | |
4435 | - i=(1 << Img.Raster->GetPlanes())-1; | |
4465 | + i = (1 << Img.Raster->GetPlanes())-1; | |
4436 | 4466 | fputc(i,f); |
4437 | 4467 | |
4438 | - for(i=0;i<(1 << Img.Raster->GetPlanes());i++) | |
4468 | + for(i=0; i<(1 << Img.Raster->GetPlanes()); i++) | |
4439 | 4469 | { |
4440 | 4470 | pal.Flag=i; |
4441 | 4471 | pal.Red= Img.Palette->R(i); //Red; |
@@ -4458,14 +4488,30 @@ | ||
4458 | 4488 | //-------------------------RAS-SUN------------------------- |
4459 | 4489 | #ifdef SupportRAS_SUN |
4460 | 4490 | |
4491 | +// https://www.fileformat.info/format/sunraster/egff.htm | |
4492 | + | |
4493 | +// Raster type: | |
4494 | +//0000h Old | |
4495 | +//0001h Standard | |
4496 | +//0002h Byte-encoded | |
4497 | +//0003h RGB format | |
4498 | +//0004h TIFF format | |
4499 | +//0005h IFF format | |
4500 | +//FFFFh Experimental | |
4501 | + | |
4502 | +// Color map type: | |
4503 | +//0000h No color map | |
4504 | +//0001h RGB color map | |
4505 | +//0002h Raw color map | |
4506 | + | |
4461 | 4507 | struct SUNRASHeader |
4462 | 4508 | { |
4463 | - DWORD ras_magic; | |
4464 | - DWORD ras_width; | |
4465 | - DWORD ras_height; | |
4466 | - DWORD ras_depth; | |
4467 | - DWORD ras_length; | |
4468 | - DWORD ras_type; | |
4509 | + DWORD ras_magic; ///< Magic (identification) number. | |
4510 | + DWORD ras_width; ///< Width of image in pixels. | |
4511 | + DWORD ras_height; ///< Height of image in pixels. | |
4512 | + DWORD ras_depth; ///< Number of bits per pixel. | |
4513 | + DWORD ras_length; ///< Size of image data in bytes. | |
4514 | + DWORD ras_type; ///< Type of raster file | |
4469 | 4515 | DWORD ras_maptype; |
4470 | 4516 | DWORD ras_maplength; |
4471 | 4517 | }; |
@@ -4488,8 +4534,7 @@ | ||
4488 | 4534 | Image LoadPictureRAS_SUN(const char *Name) |
4489 | 4535 | { |
4490 | 4536 | FILE *f; |
4491 | -WORD Ldblk; | |
4492 | -WORD k,w,i; | |
4537 | +WORD w,i; | |
4493 | 4538 | SUNRASHeader Header; |
4494 | 4539 | Image Img; |
4495 | 4540 | Raster2DAbstract *Raster=NULL; |
@@ -4506,51 +4551,129 @@ | ||
4506 | 4551 | goto FINISH; //incorrect identifier |
4507 | 4552 | } |
4508 | 4553 | |
4509 | - Raster=CreateRaster2D(Header.ras_width,Header.ras_height,Header.ras_depth); | |
4554 | + Raster = CreateRaster2D(Header.ras_width,Header.ras_height,Header.ras_depth); | |
4510 | 4555 | if(Raster==NULL) goto FINISH; |
4511 | -//if(AlineProc!=NULL) AlineProc^.InitPassing(p.y,'Loading SUNRAS'); | |
4556 | + //if(AlineProc!=NULL) AlineProc^.InitPassing(p.y,'Loading SUNRAS'); | |
4512 | 4557 | |
4513 | 4558 | if(Header.ras_maptype!=0 && Header.ras_maplength!=0) |
4514 | 4559 | { |
4515 | - Palette=BuildPalette(1<<Header.ras_depth,8); | |
4516 | - w=(Header.ras_maplength / 3) - 1; | |
4517 | - if( w < (1<<Header.ras_depth) ) | |
4560 | + Palette = BuildPalette(1<<Header.ras_depth,8); | |
4561 | + w = (Header.ras_maplength / 3) - 1; | |
4562 | + if(w < (1<<Header.ras_depth) ) | |
4518 | 4563 | { |
4519 | 4564 | for(i=0;i<=w;i++) Palette->R(i,fgetc(f)); //Red |
4520 | 4565 | for(i=0;i<=w;i++) Palette->G(i,fgetc(f)); //Green |
4521 | 4566 | for(i=0;i<=w;i++) Palette->B(i,fgetc(f)); //Blue |
4522 | - }; | |
4567 | + } | |
4523 | 4568 | if(GrayPalette(Palette,Raster->GetPlanes())) |
4524 | - { | |
4525 | - delete Palette; | |
4526 | - Palette=NULL; | |
4527 | - } | |
4569 | + { | |
4570 | + delete Palette; | |
4571 | + Palette=NULL; | |
4572 | + } | |
4528 | 4573 | |
4529 | 4574 | fseek(f,sizeof(Header)+Header.ras_maplength,SEEK_SET); |
4530 | - }; | |
4531 | - | |
4532 | - Ldblk=((long)Header.ras_depth*Header.ras_width+7) / 8; | |
4533 | - k=(-Ldblk) & 1; | |
4534 | - for(i=0;i<Header.ras_height;i++) | |
4535 | - { | |
4536 | - if(fread(Raster->GetRow(i),Ldblk,1,f)!=1) goto FINISH; | |
4537 | - if(i<Header.ras_height-1) fseek(f,k,SEEK_CUR); //docteni do konce radku | |
4575 | + } | |
4576 | + | |
4577 | + { | |
4578 | + const long Ldblk = ((long)Header.ras_depth*Header.ras_width+7) / 8; | |
4579 | + const char Padding = (-Ldblk) & 1; | |
4580 | + for(i=0; i<Header.ras_height; i++) | |
4581 | + { | |
4582 | + if(fread(Raster->GetRow(i),Ldblk,1,f)!=1) goto FINISH; | |
4583 | + if(Header.ras_depth==24 && Header.ras_type!=3) | |
4584 | + RGB_BGR((char *)Raster->GetRow(i),Raster->GetSize1D()); | |
4585 | + | |
4586 | + if(i<Header.ras_height-1 && Padding>0) | |
4587 | + fseek(f,Padding,SEEK_CUR); //docteni do konce radku | |
4538 | 4588 | //if InOutRes!=0 then goto KONEC; |
4539 | 4589 | //if AlineProc!=NULL then AlineProc^.NextLine; |
4540 | - } | |
4541 | - | |
4542 | - if(Header.ras_depth==24) | |
4543 | - for(i=0;i<Raster->Size2D;i++) | |
4544 | - RGB_BGR((char *)Raster->GetRow(i),Raster->GetSize1D()); | |
4590 | + } | |
4591 | + } | |
4545 | 4592 | |
4546 | 4593 | FINISH: |
4547 | 4594 | fclose(f); |
4548 | 4595 | Img.AttachRaster(Raster); |
4549 | - Img.AttachPalette(Palette); | |
4596 | + Img.AttachPalette(Palette); | |
4550 | 4597 | return(Img); |
4551 | 4598 | } |
4552 | 4599 | #endif |
4553 | 4600 | |
4601 | + | |
4602 | +#if SupportRAS_SUN>=3 | |
4603 | +#endif | |
4604 | + | |
4605 | +inline long SaveSUNRASHeader(FILE *f, SUNRASHeader &SU) | |
4606 | +{ | |
4607 | +#if defined(__PackedStructures__) | |
4608 | + return(fwrite(&SU,1,sizeof(SU),f)); | |
4609 | +#else | |
4610 | + return(savestruct(f,"DDDDDDDD", | |
4611 | + SU.ras_magic, SU.ras_width, SU.ras_height, | |
4612 | + SU.ras_depth, SU.ras_length, SU.ras_type, | |
4613 | + SU.ras_maptype, SU.ras_maplength)); | |
4614 | +#endif | |
4615 | +} | |
4616 | + | |
4617 | +int SavePictureRAS_SUN(const char *Name, const Image &Img) | |
4618 | +{ | |
4619 | +SUNRASHeader Header; | |
4620 | +FILE *f; | |
4621 | +long Ldblk; | |
4622 | +char padding; | |
4623 | +int i; | |
4624 | +int Result = 0; | |
4625 | + | |
4626 | + if(Img.Raster==NULL) return(-10); | |
4627 | + | |
4628 | + if((f=fopen(Name,"wb"))==NULL) return(-1); | |
4629 | + | |
4630 | + Header.ras_magic = 0x59A66A95; | |
4631 | + Header.ras_width = Img.Raster->Size1D; | |
4632 | + Header.ras_height = Img.Raster->Size2D; | |
4633 | + Header.ras_depth = labs(Img.Raster->GetPlanes()); | |
4634 | + | |
4635 | + Ldblk = ((long)Header.ras_depth*Header.ras_width+7) / 8; | |
4636 | + padding = (-Ldblk) & 1; | |
4637 | + | |
4638 | + Header.ras_length = Header.ras_height * (padding + Ldblk); | |
4639 | + Header.ras_type = 0001; // Standard | |
4640 | + if(Img.Palette!=NULL && Img.Palette->GetSize1D()>0) | |
4641 | + { | |
4642 | + Header.ras_maptype = 1; | |
4643 | + Header.ras_maplength = 3*Img.Palette->GetSize1D(); | |
4644 | + } | |
4645 | + else | |
4646 | + { | |
4647 | + Header.ras_maptype = 0; | |
4648 | + Header.ras_maplength = 0; | |
4649 | + } | |
4650 | + if(SaveSUNRASHeader(f,Header) != 32) | |
4651 | + {Result=-1; goto FINISH;} | |
4652 | + | |
4653 | + if(Header.ras_maptype!=0 && Header.ras_maplength!=0) | |
4654 | + { | |
4655 | + for(i=0; i<Img.Palette->GetSize1D(); i++) fputc(Img.Palette->R(i),f); | |
4656 | + for(i=0; i<Img.Palette->GetSize1D(); i++) fputc(Img.Palette->G(i),f); | |
4657 | + for(i=0; i<Img.Palette->GetSize1D(); i++) fputc(Img.Palette->B(i),f); | |
4658 | + } | |
4659 | + | |
4660 | + for(i=0; i<Header.ras_height; i++) | |
4661 | + { | |
4662 | + if(Header.ras_depth==24) | |
4663 | + RGB_BGR((char *)Img.Raster->GetRow(i),Img.Raster->GetSize1D()); | |
4664 | + Result = fwrite(Img.Raster->GetRow(i),Ldblk,1,f); | |
4665 | + if(Header.ras_depth==24) | |
4666 | + RGB_BGR((char *)Img.Raster->GetRow(i),Img.Raster->GetSize1D()); | |
4667 | + if(Result!=1) {Result=-2; goto FINISH;} | |
4668 | + if(padding>0) fwrite(&padding,1,1, f); | |
4669 | + } | |
4670 | + Result = 0; | |
4671 | + | |
4672 | +FINISH: | |
4673 | + fclose(f); | |
4674 | +return Result; | |
4675 | +} | |
4676 | + | |
4554 | 4677 | #endif |
4555 | 4678 | //-----------------End of RAS-SUN routines--------------- |
4556 | 4679 |
@@ -4643,7 +4766,7 @@ | ||
4643 | 4766 | if((f=fopen(Name,"rb"))==NULL) return(Img); |
4644 | 4767 | // Pbuf.Init; |
4645 | 4768 | // p.Erase; |
4646 | - if(fread(&Header,2,1,f)!=1) {fclose(f);return(Img);}; | |
4769 | + if(fread(&Header,2,1,f)!=1) {fclose(f);return(Img);} | |
4647 | 4770 | |
4648 | 4771 | RdWORD_TIFF=NULL;RdDWORD_TIFF=NULL; |
4649 | 4772 | if(Header.CharId[0]=='I' && Header.CharId[1]=='I') |
@@ -6612,7 +6735,7 @@ | ||
6612 | 6735 | { |
6613 | 6736 | fread(&bbuf,1,1,f); |
6614 | 6737 | InsertByte(bbuf); |
6615 | - }; | |
6738 | + } | |
6616 | 6739 | } |
6617 | 6740 | else { // repeat previous line runcount* |
6618 | 6741 | fread(&RunCount,1,1,f); |