From 5934e0d7fd2c754f2ecdc8c0a5a1c8cfa743bcf1 Mon Sep 17 00:00:00 2001 From: Thomas Bernard Date: Fri, 2 Feb 2018 10:59:23 +0100 Subject: [PATCH] remove global variable IFF_buffer --- src/fileformats.c | 113 ++++++++++++++++++++++------------------------ 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/src/fileformats.c b/src/fileformats.c index 90eafa8e..03971f54 100644 --- a/src/fileformats.c +++ b/src/fileformats.c @@ -244,7 +244,6 @@ typedef struct word Y_screen; } T_IFF_Header; -byte * IFF_buffer; FILE *IFF_file; // -- Tester si un fichier est au format IFF -------------------------------- @@ -482,10 +481,12 @@ byte IFF_Wait_for(const char * expected_section) /// /// Decodes the color of one pixel from the ILBM line buffer. +/// Planar to chunky conversion +/// @param buffer Planar buffer /// @param x_pos Position of the pixel in graphic line /// @param real_line_size Width of one bitplane in memory, in bytes /// @param bitplanes Number of bitplanes -byte Get_IFF_color(word x_pos, word real_line_size, byte bitplanes) +byte Get_IFF_color(const byte * buffer, word x_pos, word real_line_size, byte bitplanes) { byte shift = 7 - (x_pos & 7); int address,masked_bit,plane; @@ -494,7 +495,7 @@ byte Get_IFF_color(word x_pos, word real_line_size, byte bitplanes) for(plane=bitplanes-1;plane>=0;plane--) { address = (real_line_size * plane + x_pos) >> 3; - masked_bit = (IFF_buffer[address] >> shift) & 1; + masked_bit = (buffer[address] >> shift) & 1; color = (color << 1) + masked_bit; } @@ -502,7 +503,7 @@ byte Get_IFF_color(word x_pos, word real_line_size, byte bitplanes) return color; } -void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes) +void Set_IFF_color(byte * buffer, word x_pos, byte color, word real_line_size, byte bitplanes) { byte shift = 7 - (x_pos & 7); int address, plane; @@ -510,13 +511,13 @@ void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes) for(plane=0;plane> 3; - IFF_buffer[address] |= (color&1) << shift; + buffer[address] |= (color&1) << shift; color = color >> 1; } } // ----------------------- Afficher une ligne ILBM ------------------------ - void Draw_IFF_line(T_IO_Context *context, short y_pos, short real_line_size, byte bitplanes) + void Draw_IFF_line(T_IO_Context *context, const byte * buffer, short y_pos, short real_line_size, byte bitplanes) { byte color; byte red,green,blue; @@ -527,7 +528,7 @@ void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes) { for (x_pos=0; x_posWidth; x_pos++) { - Set_pixel(context, x_pos,y_pos,Get_IFF_color(x_pos,real_line_size, bitplanes)); + Set_pixel(context, x_pos,y_pos,Get_IFF_color(buffer, x_pos,real_line_size, bitplanes)); } } else @@ -539,7 +540,7 @@ void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes) if (Image_HAM==6) for (x_pos=0; x_posWidth; x_pos++) // HAM6 { - temp=Get_IFF_color(x_pos,real_line_size, bitplanes); + temp=Get_IFF_color(buffer, x_pos,real_line_size, bitplanes); switch (temp & 0xF0) { case 0x10: // blue @@ -565,7 +566,7 @@ void Set_IFF_color(word x_pos, byte color, word real_line_size, byte bitplanes) else for (x_pos=0; x_posWidth; x_pos++) // HAM8 { - temp=Get_IFF_color(x_pos,real_line_size, bitplanes); + temp=Get_IFF_color(buffer,x_pos,real_line_size, bitplanes); switch (temp & 0x03) { case 0x01: // blue @@ -677,6 +678,7 @@ void Load_IFF(T_IO_Context * context) int plane; dword AmigaViewModes = 0; enum PIXEL_RATIO ratio = PIXEL_SIMPLE; + byte * buffer; Get_full_filename(filename, context->File_name, context->File_directory); @@ -887,19 +889,18 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s switch(header.Compression) { case 0: // uncompressed - IFF_buffer=(byte *)malloc(line_size); + buffer=(byte *)malloc(line_size); for (y_pos=0; ((y_posHeight) && (!File_error)); y_pos++) { - if (Read_bytes(IFF_file,IFF_buffer,line_size)) - Draw_IFF_line(context, y_pos,real_line_size, header.BitPlanes); + if (Read_bytes(IFF_file,buffer,line_size)) + Draw_IFF_line(context, buffer, y_pos,real_line_size, header.BitPlanes); else File_error=21; } - free(IFF_buffer); - IFF_buffer = NULL; + free(buffer); break; case 1: // packbits compression (Amiga) - IFF_buffer=(byte *)malloc(line_size); + buffer=(byte *)malloc(line_size); for (y_pos=0; ((y_posHeight) && (!File_error)); y_pos++) { for (x_pos=0; ((x_pos=line_size || Read_byte(IFF_file, &(IFF_buffer[x_pos++]))!=1) + if (x_pos>=line_size || Read_byte(IFF_file, &(buffer[x_pos++]))!=1) File_error=25; } if (!File_error) - Draw_IFF_line(context, y_pos,real_line_size,header.BitPlanes); + Draw_IFF_line(context, buffer, y_pos,real_line_size,header.BitPlanes); } - free(IFF_buffer); - IFF_buffer = NULL; + free(buffer); break; case 2: // vertical RLE compression (Atari ST) - IFF_buffer=(byte *)calloc(line_size*context->Height, 1); - if (IFF_buffer == NULL) + buffer=(byte *)calloc(line_size*context->Height, 1); + if (buffer == NULL) { File_error=1; Warning("Failed to allocate memory for IFF decoding"); @@ -982,7 +982,7 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s count = -commands[cmd]; while (count-- > 0 && x_pos < plane_line_size && section_size > 0) { - Read_bytes(IFF_file,IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,2); + Read_bytes(IFF_file,buffer+x_pos+y_pos*line_size+plane*plane_line_size,2); section_size -= 2; if(++y_pos >= context->Height) { @@ -1008,7 +1008,7 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s section_size -= 2; while (count-- > 0 && x_pos < plane_line_size) { - memcpy(IFF_buffer+x_pos+y_pos*line_size+plane*plane_line_size,data,2); + memcpy(buffer+x_pos+y_pos*line_size+plane*plane_line_size,data,2); if(++y_pos >= context->Height) { y_pos = 0; @@ -1025,16 +1025,12 @@ printf("%d x %d = %d %d\n", tiny_width, tiny_height, tiny_width*tiny_height, s } if (!File_error) { - byte * save_IFF_buffer = IFF_buffer; for (y_pos = 0; y_pos < context->Height; y_pos++) { - Draw_IFF_line(context,y_pos,real_line_size,real_bit_planes); - IFF_buffer += line_size; + Draw_IFF_line(context,buffer+line_size*y_pos,y_pos,real_line_size,real_bit_planes); } - IFF_buffer = save_IFF_buffer; } - free(IFF_buffer); - IFF_buffer = NULL; + free(buffer); break; default: Warning("Unknown IFF compression"); @@ -1288,6 +1284,7 @@ void Save_IFF(T_IO_Context * context) if (context->Format == FORMAT_LBM) { + byte * buffer; short line_size; // Size of line in bytes short plane_line_size; // Size of line in bytes for 1 plane short real_line_size; // Size of line in pixels @@ -1296,19 +1293,19 @@ void Save_IFF(T_IO_Context * context) real_line_size = (context->Width+15) & ~15; plane_line_size = real_line_size >> 3; // 8bits per byte line_size = plane_line_size * header.BitPlanes; - IFF_buffer=(byte *)malloc(line_size); + buffer=(byte *)malloc(line_size); // Start encoding IFF_list_size=0; for (y_pos=0; ((y_posHeight) && (!File_error)); y_pos++) { // Dispatch the pixel into planes - memset(IFF_buffer,0,line_size); + memset(buffer,0,line_size); for (x_pos=0; x_posWidth; x_pos++) - Set_IFF_color(x_pos, Get_pixel(context, x_pos,y_pos), real_line_size, header.BitPlanes); + Set_IFF_color(buffer, x_pos, Get_pixel(context, x_pos,y_pos), real_line_size, header.BitPlanes); if (context->Width&1) // odd width fix - Set_IFF_color(x_pos, 0, real_line_size, header.BitPlanes); + Set_IFF_color(buffer, x_pos, 0, real_line_size, header.BitPlanes); // encode the resulting sequence of bytes if (header.Compression) @@ -1319,7 +1316,7 @@ void Save_IFF(T_IO_Context * context) for (plane=0; planeWidth; x_pos++) { - color=(IFF_buffer[x_pos/reduction]>>((reduction_minus_one-(x_pos%reduction))*depth)) & byte_mask; + color=(buffer[x_pos/reduction]>>((reduction_minus_one-(x_pos%reduction))*depth)) & byte_mask; Set_pixel(context, x_pos,y_pos,color); } } @@ -3860,7 +3856,7 @@ void Load_PCX(T_IO_Context * context) // On se sert de données ILBM car le dessin de ligne en moins de 256 // couleurs se fait comme avec la structure ILBM. Image_HAM=0; - IFF_buffer=(byte *)malloc(line_size); + buffer=(byte *)malloc(line_size); // Chargement de l'image if (PCX_header.Compression) // Image compressée @@ -3919,7 +3915,7 @@ void Load_PCX(T_IO_Context * context) { for (index=0; indexHeight) && (!File_error);y_pos++) { - if ((width_read=Read_bytes(file,IFF_buffer,line_size))) + if ((width_read=Read_bytes(file,buffer,line_size))) { if (PCX_header.Plane==1) for (x_pos=0; x_posWidth;x_pos++) - Set_pixel(context, x_pos,y_pos,IFF_buffer[x_pos]); + Set_pixel(context, x_pos,y_pos,buffer[x_pos]); else { if (PCX_header.Depth==1) - Draw_IFF_line(context, y_pos,real_line_size,PCX_header.Plane); + Draw_IFF_line(context, buffer, y_pos,real_line_size,PCX_header.Plane); else - Draw_PCX_line(context, y_pos,PCX_header.Depth); + Draw_PCX_line(context, buffer, y_pos,PCX_header.Depth); } } else @@ -3962,8 +3958,7 @@ void Load_PCX(T_IO_Context * context) } } - free(IFF_buffer); - IFF_buffer = NULL; + free(buffer); } } } @@ -4223,6 +4218,7 @@ void Load_SCx(T_IO_Context * context) long file_size; T_SCx_Header SCx_header; T_Palette SCx_Palette; + byte * buffer; Get_full_filename(filename, context->File_name, context->File_directory); @@ -4260,13 +4256,13 @@ void Load_SCx(T_IO_Context * context) if (!SCx_header.Planes) { // 256 couleurs (raw) - IFF_buffer=(byte *)malloc(context->Width); + buffer=(byte *)malloc(context->Width); for (y_pos=0;(y_posHeight) && (!File_error);y_pos++) { - if (Read_bytes(file,IFF_buffer,context->Width)) + if (Read_bytes(file,buffer,context->Width)) for (x_pos=0; x_posWidth;x_pos++) - Set_pixel(context, x_pos,y_pos,IFF_buffer[x_pos]); + Set_pixel(context, x_pos,y_pos,buffer[x_pos]); else File_error=2; } @@ -4275,19 +4271,18 @@ void Load_SCx(T_IO_Context * context) { // moins de 256 couleurs (planar) size=((context->Width+7)>>3)*SCx_header.Planes; real_size=(size/SCx_header.Planes)<<3; - IFF_buffer=(byte *)malloc(size); + buffer=(byte *)malloc(size); Image_HAM=0; for (y_pos=0;(y_posHeight) && (!File_error);y_pos++) { - if (Read_bytes(file,IFF_buffer,size)) - Draw_IFF_line(context, y_pos,real_size,SCx_header.Planes); + if (Read_bytes(file,buffer,size)) + Draw_IFF_line(context, buffer, y_pos,real_size,SCx_header.Planes); else File_error=2; } } - free(IFF_buffer); - IFF_buffer = NULL; + free(buffer); } else File_error=1;