rewrite Save_NEO(). Now writes color Cycling info
This commit is contained in:
parent
7a2c46ccc4
commit
93bc0e6459
@ -2419,66 +2419,127 @@ error:
|
|||||||
/// Save in NeoChrome format
|
/// Save in NeoChrome format
|
||||||
void Save_NEO(T_IO_Context * context)
|
void Save_NEO(T_IO_Context * context)
|
||||||
{
|
{
|
||||||
FILE *file;
|
word resolution = 0;
|
||||||
|
FILE *file = NULL;
|
||||||
short x_pos,y_pos;
|
short x_pos,y_pos;
|
||||||
byte * buffer;
|
word color_cycling_range = 0, color_cycling_delay = 0;
|
||||||
byte * ptr;
|
word display_time = 0;
|
||||||
|
word image_width = 320, image_height = 200;
|
||||||
|
byte buffer[32];
|
||||||
byte pixels[320];
|
byte pixels[320];
|
||||||
|
char * ext;
|
||||||
|
int i, j;
|
||||||
|
|
||||||
File_error=0;
|
File_error = 1;
|
||||||
// Ouverture du fichier
|
file = Open_file_write(context);
|
||||||
if ((file=Open_file_write(context)))
|
if (file == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// flags and resolution
|
||||||
|
if (!Write_word_be(file, 0) || !Write_word_be(file, resolution))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
// palette
|
||||||
|
PI1_code_palette(context->Palette, buffer);
|
||||||
|
if (!Write_bytes(file, buffer, 16*2))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
// file name
|
||||||
|
i = 0;
|
||||||
|
j = 0;
|
||||||
|
ext = strrchr(context->File_name, '.');
|
||||||
|
while (j < 8 && ext != (context->File_name + i))
|
||||||
{
|
{
|
||||||
setvbuf(file, NULL, _IOFBF, 64*1024);
|
byte c = context->File_name[i++];
|
||||||
|
if (c == 0)
|
||||||
// allocation d'un buffer mémoire
|
break;
|
||||||
buffer=(byte *)malloc(32128);
|
if (c >= 'a' && c <= 'z')
|
||||||
// Codage de la résolution
|
c -= 32;
|
||||||
buffer[0]=0x00;
|
if ((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'))
|
||||||
buffer[1]=0x00;
|
buffer[j++] = c;
|
||||||
buffer[2]=0x00;
|
|
||||||
buffer[3]=0x00;
|
|
||||||
// Codage de la palette
|
|
||||||
PI1_code_palette(context->Palette, buffer+4);
|
|
||||||
// Codage de l'image
|
|
||||||
ptr=buffer+128;
|
|
||||||
for (y_pos=0;y_pos<200;y_pos++)
|
|
||||||
{
|
|
||||||
// Codage de la ligne
|
|
||||||
memset(pixels,0,320);
|
|
||||||
if (y_pos<context->Height)
|
|
||||||
{
|
|
||||||
for (x_pos=0;(x_pos<320) && (x_pos<context->Width);x_pos++)
|
|
||||||
pixels[x_pos]=Get_pixel(context, x_pos,y_pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (x_pos=0;x_pos<(320>>4);x_pos++)
|
|
||||||
{
|
|
||||||
PI1_16p_to_8b(pixels+(x_pos<<4),ptr);
|
|
||||||
ptr+=8;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Write_bytes(file,buffer,32128))
|
|
||||||
{
|
|
||||||
fclose(file);
|
|
||||||
}
|
|
||||||
else // Error d'écriture (disque plein ou protégé)
|
|
||||||
{
|
|
||||||
fclose(file);
|
|
||||||
Remove_file(context);
|
|
||||||
File_error=1;
|
|
||||||
}
|
|
||||||
// Libération du buffer mémoire
|
|
||||||
free(buffer);
|
|
||||||
buffer = NULL;
|
|
||||||
}
|
}
|
||||||
else
|
while (j < 8)
|
||||||
|
buffer[j++] = ' ';
|
||||||
|
buffer[j++] = '.';
|
||||||
|
if (ext != NULL)
|
||||||
{
|
{
|
||||||
|
i = 0;
|
||||||
|
while (j < 12)
|
||||||
|
{
|
||||||
|
byte c = ext[i++];
|
||||||
|
if (c == 0)
|
||||||
|
break;
|
||||||
|
if (c >= 'a' && c <= 'z')
|
||||||
|
c -= 32;
|
||||||
|
if ((c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || (c == '_'))
|
||||||
|
buffer[j++] = c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (j < 12)
|
||||||
|
buffer[j++] = ' ';
|
||||||
|
|
||||||
|
if (!Write_bytes(file, buffer, 12))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
// Save the 1st valid Color cycling range
|
||||||
|
for (i = 0; i < context->Color_cycles; i++)
|
||||||
|
{
|
||||||
|
if (context->Cycle_range[i].Start < 16 && context->Cycle_range[i].End < 16)
|
||||||
|
{
|
||||||
|
color_cycling_range = 0x8000 | (context->Cycle_range[i].Start << 4) | context->Cycle_range[i].End;
|
||||||
|
if (context->Cycle_range[i].Speed > 0)
|
||||||
|
{
|
||||||
|
color_cycling_delay = 175 / context->Cycle_range[i].Speed;
|
||||||
|
if (color_cycling_delay > 0 && context->Cycle_range[i].Inverse)
|
||||||
|
color_cycling_delay = 256 - color_cycling_delay;
|
||||||
|
color_cycling_delay |= 0x8000;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!Write_word_be(file, color_cycling_range) || !Write_word_be(file, color_cycling_delay) || !Write_word_be(file, display_time))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
// Save image position and size
|
||||||
|
if (!Write_word_be(file, 0) || !Write_word_be(file, 0)
|
||||||
|
|| !Write_word_be(file, image_width) || !Write_word_be(file, image_height))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
// Fill with 128 bytes header with 0's
|
||||||
|
// a few files have the string "NEO!" at offset 124 (0x7C)
|
||||||
|
for (i = ftell(file); i < 128; i++)
|
||||||
|
{
|
||||||
|
if (!Write_byte(file, 0))
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
// image coding
|
||||||
|
for (y_pos=0;y_pos<200;y_pos++)
|
||||||
|
{
|
||||||
|
// Codage de la ligne
|
||||||
|
memset(pixels, 0, 320);
|
||||||
|
if (y_pos < context->Height)
|
||||||
|
{
|
||||||
|
for (x_pos = 0; (x_pos < 320) && (x_pos < context->Width); x_pos++)
|
||||||
|
pixels[x_pos] = Get_pixel(context, x_pos, y_pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (x_pos=0; x_pos < 320; x_pos += 16)
|
||||||
|
{
|
||||||
|
PI1_16p_to_8b(pixels + x_pos, buffer);
|
||||||
|
if (!Write_bytes(file, buffer, 8))
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
File_error = 0;
|
||||||
|
return;
|
||||||
|
|
||||||
|
error:
|
||||||
|
if (file != NULL)
|
||||||
fclose(file);
|
fclose(file);
|
||||||
Remove_file(context);
|
Remove_file(context);
|
||||||
File_error=1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @} */
|
/* @} */
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user